如何同时使用NLog实现基于大小和时间的日志归档?
结合NLog的大小与时间双重日志归档方案
嘿,我刚好之前处理过一模一样的需求,其实NLog的FileTarget原生就支持同时基于大小和时间触发归档,根本不用分开配置两套规则,只要把对应的参数组合起来就能实现你要的效果:当日志文件超过10MB时立即归档,同时每天自动生成新的日志文件(哪怕当天文件没到10MB)。
完整配置示例
下面是一个可直接复用的NLog配置片段,我会逐行解释关键参数的作用:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <!-- 主日志输出目标 --> <target name="dailySizeRollingFile" xsi:type="File" fileName="${basedir}/logs/current_log.txt" <!-- 归档文件名格式:日期+序号,避免重名冲突 --> archiveFileName="${basedir}/logs/archive/log_${shortdate}_{#####}.txt" <!-- 大小阈值:10MB(单位为字节,10*1024*1024=10485760) --> archiveAboveSize="10485760" <!-- 启用每日归档周期 --> archiveEvery="Day" <!-- 归档文件编号方式:按序列递增 --> archiveNumbering="Sequence" <!-- 最多保留100个归档文件(可根据存储需求调整) --> maxArchiveFiles="100" <!-- 优化写入性能的配置 --> concurrentWrites="true" keepFileOpen="true" <!-- 自定义日志格式(可根据需求修改) --> layout="${longdate} ${level:uppercase=true} ${logger} - ${message} ${exception:format=ToString}" /> </targets> <rules> <logger name="*" minlevel="Info" writeTo="dailySizeRollingFile" /> </rules> </nlog>
关键参数详解
archiveAboveSize="10485760":设定单日志文件的最大容量为10MB,一旦当前文件达到这个大小,NLog会立即将其归档,并创建新的当前日志文件继续写入。archiveEvery="Day":开启每日归档规则,到第二天零点时,不管当前文件大小如何,都会触发归档操作,生成新的当日日志文件。archiveFileName="${basedir}/logs/archive/log_${shortdate}_{#####}.txt":归档文件名同时包含日期(${shortdate},格式如2024-05-20)和5位序号(${#####}),这样既区分了不同日期的归档,也能在同一天内生成多个超大小阈值的归档文件(比如log_2024-05-20_00001.txt、log_2024-05-20_00002.txt)。archiveNumbering="Sequence":指定归档文件的编号方式为序列递增,确保同一天内的多个归档文件不会重名覆盖。
实际运行效果
- 当日志量较大,不到一天就超过10MB:NLog会即时归档当前文件,生成带序号的归档文件,然后继续写入新的当前日志;若再次达到大小阈值,会重复该流程。
- 当日志量较小,全天未到10MB:到次日零点时,NLog会自动将当天的文件归档(序号为00001),并创建新的当日日志文件。
这样就完美实现了你需要的「大小+时间」双重归档逻辑啦!
内容的提问来源于stack exchange,提问作者ram dvash
相关产品推荐
相关产品推荐

