nlog日志滚动需显式配置archiveevery、archiveabovesize等参数,不支持“或”逻辑,仅支持日期或大小单一模式;archivefilename须匹配归档类型,不可混用{#}与日期占位符。

NLog 默认不自动按日期和大小滚动日志,必须显式配置 archiveEvery、archiveAboveSize 和 maxArchiveFiles 等参数,否则日志文件会无限增长或只按单一条件归档。
配置 target 的滚动策略需同时指定日期与大小条件
NLog 不支持“任一条件满足即归档”,而是按优先级顺序触发:先检查 archiveAboveSize,再检查 archiveEvery(如 Day)。两者可共存,但归档行为是叠加的,不是“或”逻辑。
-
archiveAboveSize单位是字节,常用值如10485760(10MB),超过即触发归档(原文件重命名,新建空文件) -
archiveEvery设为Day时,每天 00:00 创建新文件;设为Hour则每小时新建;注意它不删除旧文件,只是切换写入目标 -
maxArchiveFiles控制归档文件总数上限,超出后按时间顺序删除最老的归档(非当前日志文件) - 归档文件名由
archiveFileName决定,必须含占位符如{#}(序号)或{yyyy-MM-dd}(日期),否则归档失败且静默忽略
示例关键配置片段:
<target xsi:type="File" name="fileTarget" filename="logs/app.log" archivefilename="logs/app.{#}.log" archiveabovesize="10485760" archiveevery="Day" maxarchivefiles="30" enablearchivefilecompression="true"></target>
archiveFileName 中的 {#} 和日期格式不能混用
如果 archiveEvery="Day",NLog 默认用日期生成归档名(如 app.2024-05-20.log),此时若 archiveFileName 含 {#},会导致归档名冲突或跳过归档——因为 NLog 认为这是“序号模式”,不再解析日期占位符。
- 要按日期归档:设
archiveEvery="Day",archiveFileName用app.{yyyy-MM-dd}.log,删掉{#} - 要按大小+序号归档:删掉
archiveEvery,仅留archiveAboveSize和archiveFileName="app.{#}.log" - 想两者兼顾?不行。NLog 不支持混合模式。必须选其一,或改用自定义
ArchiveNumbering(如Rolling模式,但会丢失精确日期名)
日志写入卡顿?检查 keepFileOpen 和 concurrentWrites
默认 keepFileOpen="false",每次写日志都打开/关闭文件,高并发下易成瓶颈;而 concurrentWrites="true"(默认开启)会引入文件锁竞争,尤其在容器或网络路径下更明显。
- 单进程写入:设
keepFileOpen="true"+concurrentWrites="false",性能提升明显 - 多进程共享日志(如 IIS 多工作进程):必须保留
concurrentWrites="true",但keepFileOpen应为false(否则 Windows 下报IOException: 文件正由另一进程使用) - Linux 容器中,即使单进程也建议关掉
concurrentWrites,避免 inotify 监控干扰
归档后日志消失?确认 archiveDateFormat 和时区
使用 {yyyy-MM-dd} 时,NLog 按服务器本地时区生成归档名。若服务器时区为 UTC,但业务日志需按东八区切分,归档文件会晚 8 小时创建,导致你以为“没归档”。
- 强制指定时区:用
archiveDateFormat="yyyy-MM-dd" layout="${date:format=yyyy-MM-dd:timezone=China Standard Time}"不生效——archiveDateFormat是字符串模板,不支持 layout 表达式 - 正确做法:在
archiveFileName中写死偏移,如app.${date:format=yyyy-MM-dd:offset=+08:00}.log(仅适用于 .NET 6+,且需确保 NLog 版本 ≥ 5.0) - 更稳妥方式:统一服务器时区为 CST,或改用
archiveEvery="Hour"避开跨日问题
归档逻辑本身不记录失败日志(除非开启 internalLogLevel),出问题只能靠观察文件生成时间和数量来反推。










