ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-20 11:02:26  阅读:207  来源: 互联网

标签:FileStream NLog LogUtil 日志 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有