문제

C# 및 .NET 's를 사용하여 Windows 이벤트 로그에 쓰는 일부 코드에 간헐적 인 문제가 있습니다. EventLog 수업.

기본적 으로이 코드는 매일 완벽하게 작동하지만 때로는 다음과 같은 오류가 발생합니다.

"System.ArgumentException : 사용자 지정 로그 이름의 처음 8 자만 중요하며 이름의 이름의 처음 8자를 사용하여 시스템에 이미 다른 로그가 있습니다. 신청'."

영향을받는 통화 스택이 다음과 같습니다. 실제로 기존에 글을 쓰려고하는 것을 분명히 알 수 있습니다. LB_Email 통나무 (LogEmail 첫 번째라고합니다.

public static void LogEmail(string to, string type)
{
    string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
    Log(message, "LB_Email", EventLogEntryType.Information);
}

private static void Log(string message, string logName, EventLogEntryType type)
{
    using (EventLog aLog = new EventLog())
    {
        aLog.Source = logName;
        aLog.WriteEntry(message, type);
    }
}

오류가 시작되면 우리에게 액세스하는 것 같습니다. LB_Email EventLog가 어떻게 든 잠겨 있습니다. 특정 EventLog의 속성보기에는 대부분의 정보가 회색 및 변경되지 않을 수 있으며 다른 프로세스는 해당 로그에 로깅하는 것을 방지하는 것으로 보입니다. 그러나 'LB_ERROR'로그에 로그인하는 시도 캐치를 통해 오류 (위의 동일한 로그 메소드를 사용하는)를보고 있으며, 이는 예상대로 계속 작동합니다.

다중 스레드 애플리케이션 에서이 코드를 호출하고 있지만 위의 코드가 스레드 안전인지 아닌지를 식별 할 수 없었습니다.

또한 프로세스를 죽이고 다시 시작한 후 문제의 로그가 다시 제대로 작동하고 있음을 확인할 수 있습니다.

나는 당신의 생각과 제안을 듣고 싶습니다.

도움이 되었습니까?

해결책

그만큼 선적 서류 비치 다음을 설명합니다.

소스를 사용하여 한 번에 하나의 로그에 쓸 수 있습니다.

그래서 나는이 문제가 당신의 멀티 스레드 앱으로 Log 주어진 시간과 동일한 소스에 대해 한 번 더 많은 방법.

정적 클래스 (또는 메소드) 대신이 이벤트를 기록하는 데 스레드 안전 싱글 톤 클래스를 사용하는 것이 좋습니다.

편집하다:

Jon Skeet은 있습니다 훌륭한 기사 싱글 톤에서.

싱글 톤 클래스를 구현하고 싶지 않다면 다음과 같은 일을 할 수 있습니다.

    static readonly object lockObj = new object();

    public static void LogEmail(string to, string type)
    {
        string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
        Log(message, "LB_Email", EventLogEntryType.Information);
    }

    private static void Log(string message, string logName, EventLogEntryType type)
    {
        lock (lockObj)
        {
            using (EventLog aLog = new EventLog())
            {
                aLog.Source = logName;
                aLog.WriteEntry(message, type);
            }
        }
    }

이것이 당신의 문제를 해결하기를 바랍니다.

다른 팁

감사합니다 Bruno,

그렇다면 로그 메소드의 EventLog 인스턴스가 다른 스레드에서 동일한 메소드 호출의 EventLog 인스턴스와 다르다고 생각하는 데 착각합니까? 아니면 정적 메소드 내부의 객체 인스턴스에 대해 혼란스러워하고 있습니까?

좋아, 그래서 로그 (...) 메소드에 몇 가지 래퍼 방법이 있습니다. 로그 메소드를 싱글 톤 클래스로 옮기고 포장지 (logemail, logxxxx, logyyy 등을 변경 한 다음 log.zzzz 인터페이스를 동일하게 유지할 수 있지만 Singleton Logsingleton.instance.log)의 보안을 활용할 수 있습니다. 현재 기록에서.

당신은 내가 혼란스러워한다고 말할 수 있습니다 :) 예 - 동기화 코드에 정말 감사합니다 :)

NIJ

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top