发现NLog在某些情况下概率性丢失日志的BUG

  • 发现NLog在某些情况下概率性丢失日志的BUG已关闭评论
  • 239 次浏览
  • A+
所属分类:.NET技术
摘要

LogUtil_NLog有BUG的配置和测试代码https://gitee.com/s0611163/LogUtil


发现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