- A+
所属分类:.NET技术
发现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);