2012-12-12 2 views
0

안녕하세요. 자주 호출되는 로거 클래스가 있습니다. 가끔씩 반복적으로 호출되면 파일이 이미 열려있는 예외가 다른 응용 프로그램에서 사용 중일 때도 있습니다. 우리가이 문제를 해결할 수있는 유일한 방법은 예외를 잡아서 다시 열어 보는 것입니다. 어떻게 처리해야할지 잘 모르겠습니다. 이 로그 파일이기 때문에C# 파일 자주 열림, 이미 열려있는 예외

/// <summary> 
    /// Open a log file based on a date 
    /// </summary> 
    /// <param name="date"> Date of the file to open </param> 
    public static void OpenLogFile(DateTime date) 
    { 
     while (true) 
     { 
      try 
      { 
       logStream = File.Open("Logs/ems." + date.ToString("yyyy-MM-dd") + ".log", FileMode.Append); 
       break; 
      } 
      catch 
      { 
       continue; 
      } 
     } 
    } 




    /// <summary> 
    /// Writes to a log file the specified input 
    /// </summary> 
    /// <param name="input"> Content to write to the log file </param> 
    public static void Log(string className, string methodName, string input) 
    { 
      OpenLogFile(DateTime.Now); 

      using (StreamWriter s = new StreamWriter(logStream)) 
      { 
       s.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + '[' + className + '.' + methodName + "] " + input); 
      } 

      CloseLogFile(); 
    } 




    /// <summary> 
    /// Closes the current log file 
    /// </summary> 
    public static void CloseLogFile() 
    { 
     if (logStream != null) 
     { 
      logStream.Close(); 
      logStream = null; 
     } 
    } 
+0

멀티 스레드 응용 프로그램이라고 생각합니까? AutoResetEvent를 사용하여 파일에 대한 액세스를 제어 할 수 있습니다. – itsme86

답변

6

, 나는 명백한 (정정) 솔루션, 프로그램의 실행 기간 동안 파일을 열어두고 생각합니다.

Apache의 log4net처럼 이미 구현 된 타사 로거를 사용하지 않으려면 파일에 행을 쓰는 데 thread-safe 메커니즘을 사용하는 작은 로그 작성기 클래스를 작성할 수 있습니다.

아마도 static 클래스 또는 싱글 톤일 수 있습니다. 일반적으로 프로그램의 시작과 끝 부분에서의 실행은 매우 예측 가능하므로 초기화 할 위치와 객체/클래스를 닫아야합니다.

+2

각 쓰기 후에 플러시를 사용해야합니다 (따라서 로그가 최신 상태로 유지됨). – Trisped

+0

파일을 여는 것은 실제로 쓰기에 상대적으로 높은 오버 헤드를 가질 수 있습니다. 꼭 필요한 경우에만 닫을 수 있습니다. –

+0

Log 함수에 lock (threadObject)을 추가합니다. 당신이 파일을 쓰고 있다면, 나는 그것을 열어 두어야 할 것입니다. Microsoft Enterprise Library는 사용할 수있는 완벽한 로깅 솔루션입니다. 그것은 파일을 만들 것입니다, 특정 크기가 지나면 제거, 너무 오랜만에 퍼지, 빨래하세요 ... – Rob4md

1

주문할 때 약간의 주문이 필요합니다. 모든 디스크는 무료입니다. 로그 메시지를 큐에 저장하고 단일 스레드에서 큐를 대기열에서 제외하고 항목을 씁니다.

관련 문제