문제
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