2017-08-30 35 views
0

我目前正在質疑代碼片段,關於它的有效性和資源耗用。以下是將被編譯爲DLL的全局日誌記錄實用程序方法。該方法可以同時訪問。禮節和/或寫入文件的最佳方式

private static void Log(string logType, 
         string severity, 
         object sender, 
         string format, 
         params object[] args) 
    { 
     if (Logger._logLock.WaitOne(250)) 
     { 
      try 
      { 
       using (StreamWriter sw = new StreamWriter(Logger._activityLogPath, true)) 
       { 
        if (logType != "RAW") 
        { 
         sw.Write("{0} {1} {2} ", 
          DateTime.Now, 
          logType, 
          severity); 
        } 

        sw.WriteLine(format, args); 
       } 
      } 
      finally 
      { 
       Logger._logLock.ReleaseMutex(); 
      } 
     } 
    } 

什麼是困擾我的是「使用」塊將被從同一個文件創建一個流,每一次的東西記錄(每秒多調用)。我知道文件緩存,所以我不完全確定重新安裝流是一個太大的問題(然而不必要的流緩衝區初始化?)。我在玩Logger類時添加StreamWriter作爲變量的想法,但我也想確保在單元不正常關機的情況下寫入程序已正確關閉或刷新。已知終端用戶關閉該單元。我試圖找到安全和速度之間的平衡,只是希望有一點洞察力。謝謝。

回答

1

a)是的,每次創建一個流並不是真的有效。例如,您可能會考慮以某種集合方式收集郵件,並在固定的時間間隔內寫入/追加此集合,可能會從另一個線程傳遞到文件......這種方式您不需要等待郵件後250毫秒可以追加到集合中,線程將使用集合的內容。您還應該保持流打開 - 如果其他應用程序鎖定文件,則執行此操作的方式可能會失敗......如果在寫入硬盤關閉後進行刷新,則不應影響日誌文件的內容。

b)許多測井框架經過良好測試,靈活且性能卓越......爲什麼要重新發明輪子?

+0

感謝您的回覆和確認。我將開始尋找你提到的一些預製框架。我只是想確保我沒有錯過爲什麼代碼是按照原來的方式編寫的關鍵。原來的編碼人員並不是一個懶散的人,而且這段代碼看起來非常沒有他的特徵,所以我認爲他一定這樣做是有原因的。 –

+0

要清楚的是,如果按照您的建議實施,那麼已記錄到集合中的任何內容,在硬關閉時尚未刷新到該文件,將會丟失。請在確定適當的沖洗間隔時記住這一點。不要說這是壞的/好的或無關緊要的(取決於系統的記錄要求)。 – Kevin

+0

還要記住,異常(如果記錄它們)應該被記錄並立即刷新。 – Kevin

0

我還想確保在單元硬件不正常關機的情況下寫入器已正確關閉或刷新。

它不會如果用戶開啓裝置關閉,而流不刷新,是否使用using與否(臨界時間跨度可以更短與using和無需手動沖洗)正確關閉。

而不是每次創建一個新的StreamWriter,創建一次並在寫入後刷新它。但請注意,如果您想100%確定,則需要某種硬件(請閱讀:緩衝電池,UPS)。

+0

是的,創造它曾經似乎是我的目標。我只是想確保我沒有錯過關於使用聲明的方法論的任何關鍵問題。之前的編碼器曾爲MS工作過一次,所以我認爲必須有重新啓動的原因。也許他只是休息一天,或者影響可以忽略不計。無論哪種方式,謝謝。 –

相關問題