NLog 2.0.0.0版本中配置archiveNaming实现按日期+滚动大小归档日志的问题
NLog 2.0.0.0版本中配置archiveNaming实现按日期+滚动大小归档日志的问题
嘿,我太懂你这个困扰了——NLog 2.0这个版本确实在归档命名的灵活性上有点受限,尤其是archiveNumbering不支持直接用日期/时间戳来替代序列号。不过咱们完全可以通过调整File Target的配置参数,实现你要的「每日基础日志文件+达到大小后归档为带时间戳的文件」的效果,不用升级版本也能搞定!
给你一个可以直接用的配置片段,我会逐行给你解释为什么这么配:
<target name="dailySizeRollingLog" xsi:type="File" <!-- 当前正在写入的日志文件,每日自动切换为新的日期命名文件 --> fileName="Logfile_${machinename}_${shortdate}.log" <!-- 归档文件的命名格式:原日期文件名 + 精确到100纳秒的时间戳,确保绝对不重复 --> archiveFileName="Logfile_${machinename}_${shortdate}_${ticks}.log" <!-- 触发归档的文件大小阈值,这里设为10MB(10*1024*1024=10485760字节),你可以按需调整 --> archiveAboveSize="10485760" <!-- 滚动策略用Composite,同时支持按日期和大小触发滚动 --> rollingStyle="Composite" <!-- 因为我们用了ticks作为唯一标识,不需要序列号,所以设为None避免自动加_1/_2后缀 --> archiveNumbering="None" <!-- 强制每天生成新的基础日志文件,即使前一天的文件没达到大小阈值 --> archiveEvery="Day" <!-- 最多保留多少个归档文件,按需设置,避免磁盘占满 --> maxArchiveFiles="60" <!-- 开启并发写入支持,多线程写日志也不会出问题 --> concurrentWrites="true" <!-- 日志内容的格式,你可以根据自己的需求修改 --> layout="${longdate} [${level:uppercase=true}] ${message} ${exception:format=ToString}" />
几个关键配置的说明:
- 为什么用
${ticks}而不是普通日期格式?普通的${date:format=yyyyMMddHHmmss}最多精确到秒,如果一秒内触发多次归档,会出现重名覆盖的问题;而${ticks}是从1970年到现在的100纳秒数,绝对唯一,完美解决重名问题。 rollingStyle="Composite"是核心,它让NLog同时监听日期变化和文件大小,既保证每天生成新的基础文件,又在文件达到大小后自动归档。archiveNumbering="None"必须设置,要是设成Sequence的话,NLog会自动给归档文件加_1、_2的后缀,破坏咱们要的时间戳命名格式。
可选调整项:
- 如果你觉得
ticks的格式太长,也可以换成${date:format=yyyyMMddHHmmssfff}(精确到毫秒),只要你的日志不会在同一毫秒内触发多次归档,这个格式可读性更强,也足够用。 - 要是不需要强制每天生成新文件(比如某天日志量特别小,不需要切文件),可以把
archiveEvery="Day"去掉,只保留rollingStyle="Composite",这样NLog只会在文件达到大小或者日期变化时才滚动。
要是你配置后遇到什么问题,比如归档文件没生成、命名不对,随时告诉我你的具体配置和现象,我再帮你调整!




