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

NLog归档文件数量超出MaxArchiveFiles限制问题排查

NLog归档文件数量超出限制的问题解析

首先要纠正你对{#}的误解:ArchiveFileName中的{#}数量只负责格式化归档编号的显示位数,比如一个{#}会显示为1、2…9、10、11…,两个{#}会显示为01、02…09、10,它根本不会限制编号的最大值,这不是你问题的根源。

你设置了MaxArchiveFiles=9却出现上百个归档文件,核心问题是这个限制规则没有生效。原因在于NLog的归档编号模式默认行为,以及缺少必要的清理配置:

问题原因

默认的ArchiveNumberingMode.Sequence模式下,NLog只会在每次创建新归档文件时检查并删除超出数量的旧文件,但如果日志增长极快、或者NLog启动时未触发清理逻辑,就可能出现旧文件未被及时删除的情况,导致归档文件数量失控。

解决方案

你可以通过两种方式解决这个问题:

方式1:保留递增编号,强制清理多余归档

显式配置归档模式为Sequence,并开启启动时清理,确保NLog在启动和归档时都会检查并删除超出数量的旧文件:

var logfile = new NLog.Targets.FileTarget("logfile")
{
    FileName = Path.Combine(_logDirectory, "myApp.log"),
    Layout = "${date} [${level}] ${message} ${exception}${newline}",
    ArchiveFileName = Path.Combine(_logDirectory, "myApp.{#}.log"),
    ArchiveAboveSize = 100 * 1024, 
    MaxArchiveFiles = 9,
    ArchiveNumbering = NLog.Targets.ArchiveNumberingMode.Sequence,
    CleanupArchiveFileOnStartup = true // 启动时自动清理超出数量的归档文件
};

这种方式下,归档编号仍会递增(比如10、11…),但旧的归档文件会被自动删除,始终保留最多9个归档文件。

方式2:使用循环编号,限制编号不超过9

将归档模式改为Rolling,这种模式下编号会在1-9之间循环复用,当需要新归档时直接覆盖最旧的文件,从根源上避免编号超过9:

var logfile = new NLog.Targets.FileTarget("logfile")
{
    FileName = Path.Combine(_logDirectory, "myApp.log"),
    Layout = "${date} [${level}] ${message} ${exception}${newline}",
    ArchiveFileName = Path.Combine(_logDirectory, "myApp.{#}.log"),
    ArchiveAboveSize = 100 * 1024, 
    MaxArchiveFiles = 9,
    ArchiveNumbering = NLog.Targets.ArchiveNumberingMode.Rolling
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:05:35