2012-04-19 4 views
0

현재 로그 파일 관리를 다루는 C# 프로그램을 작성하려고합니다. 목적은 로그 파일이 50MB를 넘지 않아야하므로 파일 이름을 바꾸고 새 파일을 만든 다음 새 파일에 쓰기 시작해야합니다. 파일이 변경되는 동안 로그에 기록되는 데이터를 피하기 위해 프로그램의 한 부분에서 데이터를 버퍼에 추가 한 다음 프로그램의 다른 부분에서 버퍼의 데이터를 읽고이를 버퍼에 출력한다고 생각했습니다. 파일. 파일에 쓸 수 없으면 파일에 쓸 수있을 때까지 버퍼에 보관합니다.버퍼에 데이터 쓰기 및 버퍼에서 데이터 읽기

어떻게하면 되나요? Google에서 올바른 것을 검색하고 있는지 확실하지 않은 것으로 보이지 않습니다. 당신이

+0

로거 자체로 언제 로그를 회전시키지 않을까요? 그렇게하면 논쟁이 없습니다. –

+1

시도 [log4Net] (http://logging.apache.org/log4net/) –

+0

Log4Net은 꽤 좋습니다. – Sandeep

답변

1

이 고전 생산자 소비자 문제 같은 소리를 제공 할 수있는 모든 도움을

감사합니다. 이것은 좋은 출발점입니다. 기타로

Blocking Collection

도서관이다 사용하여 더 나은보다는 바퀴를 다시 발명 지적했다. Log4net은 좋은 로깅 라이브러리입니다.

1

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을 참조하십시오.

+0

.net 4와 내 프로그램으로 사용할 수 없습니다 .net 3.5 – Boardy

+0

@Boardy : 업데이트 된 답변보기. –

관련 문제