You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NLog归档文件名异常:日期偏移+迭代号替代有效日期问题咨询

NLog归档文件名日期偏移问题:排查与解决

嘿,我帮你梳理下这个问题的核心原因和解决办法:

为什么会出现日期+1的归档文件?

你同时配置了archiveAboveSize(按大小归档)和archiveEvery="Day"(按天归档),这两个触发条件混合使用时,NLog的日期计算逻辑踩坑了:

  • 当大小阈值先触发归档时,NLog会用当前系统的日期来生成归档文件名,而不是原日志文件对应的日期
  • 比如1月14日的日志在1月15日才达到大小上限,触发归档时就会用15日的日期命名,导致归档文件日期比实际日志日期多一天,就出现了你看到的Log_2018-01-15.00.log(本该是14日的归档)

两种可行的解决办法

办法1:只保留单一归档触发条件

如果你不需要强制按天分割日志,只需要达到指定大小就归档,直接删掉archiveEvery="Day"配置就行:

<target xsi:type="File" name="default" 
        archiveAboveSize="10000000" 
        layout="${VerboseLayout}" 
        fileName="${basedir}/logs/Log_${shortdate}.log" 
        keepFileOpen="false" 
        archiveFileName="${basedir}/logs/Log_${shortdate}.{##}.log" 
        archiveNumbering="Sequence" 
        maxArchiveFiles="50" />

这样所有归档文件都会沿用原日志的日期,不会再出现偏移。

办法2:锁定归档文件名的日期为日志创建日期

如果必须同时按天和大小归档,修改archiveFileName里的日期占位符,用${date:format=yyyy-MM-dd:cached=true}替代${shortdate}:

<target xsi:type="File" name="default" 
        archiveAboveSize="10000000" 
        layout="${VerboseLayout}" 
        fileName="${basedir}/logs/Log_${shortdate}.log" 
        keepFileOpen="false" 
        archiveFileName="${basedir}/logs/Log_${date:format=yyyy-MM-dd:cached=true}.{##}.log" 
        archiveNumbering="Sequence" 
        archiveEvery="Day" 
        maxArchiveFiles="50" />

cached=true的作用是让NLog在创建日志文件时就缓存下当时的日期,后续触发归档时会复用这个缓存的日期,而不是用当前系统日期,这样就能保证归档文件的日期和原日志完全一致。

额外小提示

  • 如果你用的是NLog 4.5之前的旧版本,这类混合归档的日期逻辑确实有bug,升级到最新稳定版也能解决不少问题
  • 要是你需要严格按天划分日志,同时每天内按大小归档,办法2是更贴合需求的选择

内容的提问来源于stack exchange,提问作者Capitan Planet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:13:30