BlockingCollection을 사용하시기 바랍니다. 로그에 쓰려는 스레드는 로그 문자열을 BlockingCollection
에 넣습니다. 별도의 스레드가 BlockingCollection
을 모니터링하고 문자열 대기열을 삭제 한 다음 파일에 기록합니다. 파일을 사용할 수없는 경우 스레드는 대기하고 다시 시도 할 수 있습니다.
몇 가지 간단한 예는 http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821을 참조하십시오.
BlockingCollection
을 사용할 수없는 경우 Queue을 사용하고 자물쇠로 보호 할 수 있습니다. 로그를 남기는 방법은 다음과 같습니다.
private Queue<string> myQueue = new Queue<string>(); // owned by the logger
void WriteLog(string s)
{
lock (myQueue)
{
myQueue.Enqueue(s);
}
}
사물을 제거하는 스레드가 대기열에서 메시지를 가져올 수 있습니다. 주기적으로 폴링해야하기 때문에 이상적보다 조금 덜 수 있습니다,하지만 너무 나쁘지 않을해야합니다
while (!shutdown) // do this until somebody shuts down the program
{
while (myQueue.Count > 0)
{
lock (myQueue)
{
string s = myQueue.Dequeue();
// write the string s to the log file
}
}
Thread.Sleep(1000); // sleep for a second and do it again.
}
가 바쁜 대기하지 않도록 할 수있는 방법이 있습니다,하지만 난하지 않습니다 구현 세부 사항을 기억하십시오. 샘플은 http://msdn.microsoft.com/en-us/library/system.threading.monitor.pulse.aspx을 참조하십시오.
로거 자체로 언제 로그를 회전시키지 않을까요? 그렇게하면 논쟁이 없습니다. –
시도 [log4Net] (http://logging.apache.org/log4net/) –
Log4Net은 꽤 좋습니다. – Sandeep