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
相关产品推荐
相关产品推荐

