2012-10-23 53 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

出於性能的原因,也避免日誌-ON之間非常不同的行爲和註銷,我建議每運行一個線程緩衝的日誌文件。

  • 一個每線程,避免鎖:沒有競爭
  • 緩衝,以避免磁盤延遲的同行是

  • 基於時間合併工具(毫秒)需要查看整個應用程序活動(vs線程活動)
  • 緩衝可能會隱藏最後的日誌記錄在殘酷終止的情況下

要進一步實時,您必須登錄內存並開發專用接口來提取登錄請求,但這種日誌通常保留給硬實時嵌入式應用程序。

對於具有低的CPU消耗(低電平C編程)安全日誌的其它的解決方案:

  • 地方的日誌記錄緩衝到共享存儲器中
  • 所觀察到的過程充當日誌記錄生產者
  • 創建日誌管理器進程,具有較高優先級,它作爲日誌記錄消費者
  • 管理落後翻轉/觸發器機制,消費者和生產者之間的溝通:在臨界區指針賦值。

如果觀察到的進程崩潰,由於共享內存段連接到日誌管理器進程,所以不會丟失日誌記錄。

+0

謝謝。我最初裁定緩衝區沒有問題,因爲我害怕沒有捕捉到每一個錯誤,但是由於這是計算密集型的,我會再次考慮這個選項。 – l46kok

+0

發佈完成。 – Aubin

0

開放,寫入,然後關閉上每個日誌請求中的文件是冗餘和低效的。

在你的日誌類,使用緩衝區,並寫緩衝區的內容的文件,無論是每一個X的請求,關機,或每Y個分鐘。

相關問題