NLog使用动态文件名时归档删除旧日志功能失效问题
问题原因
你当前的配置存在3个核心错误,导致NLog无法识别旧日志并执行删除逻辑:
- 未配置
archiveFileName归档文件命名规则:你在fileName中直接使用了${shortdate}动态变量,每天生成的日志文件名不固定,NLog默认无法将历史日期的日志文件识别为需要纳入归档计数的文件。 - 归档触发条件不匹配:仅配置
archiveOldFileOnStartup="true"只会在程序启动时对当前正在写入的固定文件名日志执行归档,而你每次启动时因为fileName带当日日期,生成的是全新文件名的日志,NLog不会关联到历史旧文件。 maxArchiveFiles参数未和匹配的归档规则绑定:该参数仅对符合archiveFileName格式的归档文件生效,没有明确归档规则的情况下参数不会生效。
修正后的配置
如果你需要按天生成日志,且自动删除超过指定天数的旧日志,可参考以下配置(示例为保留最近7天日志,可自行调整maxArchiveDays数值;如果要仅保留1个最新日志,替换为maxArchiveFiles="1"即可):
<target name="All_File" xsi:type="File" fileName="${basedir}/Log/${shortdate}-${machinename}-PROGRAM.log" archiveFileName="${basedir}/Log/${shortdate}-${machinename}-PROGRAM.log" archiveEvery="Day" maxArchiveDays="7" layout="${longdate}|${level:uppercase=true:padding=-5}|${callsite:includeNamespace=false:padding=-45}: ${message}" archiveOldFileOnStartup="true"/>
配置说明
- 明确指定
archiveFileName和fileName格式一致,让NLog可以扫描目录下所有符合该命名格式的日志文件,纳入归档计数范围 - 增加
archiveEvery="Day"配置,触发按天归档逻辑,匹配你使用${shortdate}按日命名的需求 - 用
maxArchiveDays替代maxArchiveFiles更贴合按天数删除旧日志的需求,如果你需要按文件数量保留,可替换回maxArchiveFiles参数 - NLog 4.7.5版本原生支持
maxArchiveDays参数,无需额外扩展
内容的提问来源于stack exchange,提问作者To Wa
相关产品推荐
相关产品推荐

