2012-10-23 2 views
2
public static class LogWriter 
{ 
    private static ReaderWriterLockSlim writeLock = new ReaderWriterLockSlim(); 
    public static void WriteExceptionLog(string content) 
    { 
     #if DEBUG 
     MessageBox.Show(content); 
     #endif 
     WriteLog(content, Constant.EXCEPTION_LOG_PATH); 
    } 
    public static void WriteLog(string content, string path) 
    { 
     try 
     { 
      writeLock.EnterWriteLock(); 
      string directory = Path.GetDirectoryName(path); 
      if (!Directory.Exists(Path.GetDirectoryName(directory))) 
       Directory.CreateDirectory(directory); 
      using (StreamWriter writeFile = new StreamWriter(path, true)) 
      { 
       content = DateTime.Now + " : " + content; 
       writeFile.WriteLine(content); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      writeLock.ExitWriteLock(); 
     } 
    } 
} 

로그를 쓰는 클래스가 있습니다. 비동기 적으로 로그에 쓰고 있기 때문에 쓰기가 끝나면 잠금을 설정하고 해제해야합니다.하지만 이것은 다소 어색한 해결책이며 성능에 좋지 않은 것처럼 보입니다.비동기 로그 쓰기를 처리하는 더 나은 방법

이 문제를 해결하는 더 좋은 방법은 무엇입니까?

+0

'NLog' 또는'log4Net'과 같은 기존 로깅 라이브러리를 사용하지 않을 이유가 있습니까? – RePierre

답변

3

성능상의 이유로 또한 log-on과 log-off 사이에 매우 다른 동작을 피하기 위해 스레드 당 하나의 버퍼링 된 로그 파일을 실행하는 것이 좋습니다.

  • 시간을 기준으로 병합 도구

    (밀리 초) 필요 다음 상대는

  • 디스크 대기 시간을 피하기 위해 버퍼 경합 : 잠금을 피하기 위해 스레드 당

    • 하나 (스레드 활동 대)
    • 버퍼링은 잔인한 종료의 경우 마지막 로그 레코드를 숨길 수 있습니다.

    실시간으로 한 걸음 더 나아가려면 메모리에 로그인하고 로그온 요청을 추출하기위한 전용 인터페이스를 개발해야하지만 일반적으로 이러한 종류의 로그는 하드 실시간 임베디드 응용 프로그램에 예약되어 있습니다.

    낮은 CPU 소비 (로우 레벨 C 프로그래밍)을 안전 로깅

    기타 용액 : 공유 메모리에 로그 레코드 버퍼

  • 로그 레코드 프로듀서 관찰 공정 단계는
  • 을 만들

    • 곳 로그 레코드 소비자로 작동하는 우선 순위가 높은 로그 관리자 프로세스
    • 플립/플롭 메커니즘 뒤에있는 소비자와 생산자 간의 커뮤니케이션을 관리합니다. 중요한 섹션에서 포인터를 할당합니다.

    관찰 된 프로세스가 충돌하는 경우 공유 메모리 세그먼트가 로그 관리자 프로세스에 연결되므로 로그 레코드가 손실되지 않습니다.

  • +0

    감사. 처음에는 모든 오류를 포착 할까봐 두려워했기 때문에 처음에는 버퍼를 제외 시켰지만 계산이 많이 집중됨에 따라이 옵션을 다시 고려할 것입니다. – l46kok

    +0

    게시가 완료되었습니다. – Aubin

    0

    각 로그 요청시 파일 열기, 쓰기 및 닫기가 중복되고 비효율적입니다.

    로그 클래스에서 버퍼를 사용하고 해당 버퍼의 내용을 X 요청, 종료 또는 Y 분마다 파일에 씁니다.

    관련 문제