1. 程式人生 > 其它 >發現NLog在某些情況下概率性丟失日誌的BUG

發現NLog在某些情況下概率性丟失日誌的BUG

發現NLog在某些情況下概率性丟失日誌的BUG

測試環境

  1. VS2015
  2. .NET Framework 4.5.2
  3. NLog版本4.7.11

引用的包

  1. NLog
  2. NLog.Config
  3. NLog.Schema

測試說明

  1. NLog配置檔案中,把archiveAboveSize的值改小,同時修改archiveFileName引數中的日誌檔名為${date:format=yyyyMMdd_HHmmss}_{#}.txt,以測試NLog建立日誌存檔的情況
  2. 這種配置下NLog單程序、多程序日誌寫入都有BUG,都會丟失日誌,復現概率較高

猜測BUG原因

  1. NLog寫日誌效能非常好,比log4net快的多,尤其是多程序寫日誌時,居然某些情況下比它的單程序多執行緒寫的還快;看NLog 4.7.11版本的原始碼發現,檔案寫入沒有上鎖,因為它是這樣建立FileStream的(如下程式碼所示),這種方式建立的FileStream是支援多程序併發寫入的,但是如果此時,日誌檔案大小達到配置的上限,需要存檔,因為沒有上鎖,可能會概率性異常,導致日誌丟失,如果日誌存檔以天為單位,那麼丟失的概率很低,很難發現。
new FileStream(
    logFilePath,
    FileMode.Append,
    System.Security.AccessControl.FileSystemRights.AppendData | System.Security.AccessControl.FileSystemRights.Synchronize,
    FileShare.ReadWrite,
    1,
    FileOptions.None);

測試程式下載

LogUtil_NLog有BUG的配置和測試程式碼

自己寫的LogUtil原始碼

https://gitee.com/s0611163/LogUtil