其他分享
首页 > 其他分享> > 发现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

标签:FileStream,NLog,LogUtil,日志,BUG,丢失
来源: https://www.cnblogs.com/s0611163/p/16291483.html