發現NLog在某些情況下概率性丟失日誌的BUG
阿新 • • 發佈:2022-05-20
發現NLog在某些情況下概率性丟失日誌的BUG
測試環境
- VS2015
- .NET Framework 4.5.2
- NLog版本4.7.11
引用的包
- NLog
- NLog.Config
- NLog.Schema
測試說明
- NLog配置檔案中,把archiveAboveSize的值改小,同時修改archiveFileName引數中的日誌檔名為${date:format=yyyyMMdd_HHmmss}_{#}.txt,以測試NLog建立日誌存檔的情況
- 這種配置下NLog單程序、多程序日誌寫入都有BUG,都會丟失日誌,復現概率較高
猜測BUG原因
- 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原始碼
https://gitee.com/s0611163/LogUtil