Nlog 存档文件名:迭代而不是有效日期

Nlog archive file name: iteration instead valid date

我的配置:

    <target xsi:type="File"
        name="default"
        archiveAboveSize="10000000"
        layout="${VerboseLayout}"
        fileName="${basedir}/logs/Log_${shortdate}.log"
        keepFileOpen="false"
        archiveFileName="${basedir}/logs/Log_${shortdate}.{##}.log"
        archiveNumbering="Sequence"
        archiveEvery="Day"
        maxArchiveFiles="50" />

有时命名是可以的,有时我得到的不是有效日期而是日期+1 和迭代(比如达到 archiveAboveSize 上限的情况)。 我的最后一个文件:

Log_2018-01-15.log
Log_2018-01-15.00.log (should be Log_2018-01-14)
Log_2018-01-13.log
Log_2018-01-13.00.log (should be Log_2018-01-12)
Log_2018-01-11.log
Log_2018-01-10.log

您使用的 NLog 文件存档逻辑错误:

fileName="${basedir}/logs/Log_${shortdate}.log"
archiveFileName="${basedir}/logs/Log_${shortdate}.{##}.log"
archiveEvery="Day"

您不应为 archiveFileName 指定 ${shortdate}。它将使用当前时间,而不是上一个 logevent 的时间(您所期望的)。

您不应指定 archiveEvery="Day",因为文件名已包含 ${shortdate},因此它会自动滚动到新文件。

相反,当使用 NLog 4.4 或更早版本时,您应该这样做:

fileName="${basedir}/logs/Log_${date:format=yyyy-MM-dd}.log"
archiveFileName="${basedir}/logs/Log_{##}.log"
archiveDateFormat="yyyy-MM-dd"
archiveNumbering="DateAndSequence"
archiveAboveSize="10000000"
archiveEvery="Year"
maxArchiveFiles="50"
  • archiveFileName - 使用 {#} 允许存档清理生成正确的文件通配符。
  • archiveDateFormat - 必须匹配文件名的 ${date:format=}(因此如果需要更改,请记住更正两种日期格式)
  • archiveNumbering=DateAndSequence - 配置存档清理以支持将文件名解析为日期和序列号
  • archiveEvery=Year - 激活存档清理,还有存档文件操作。因为配置的fileName自动确保了归档文件操作,那么我们不希望有任何额外的归档操作(例如避免在午夜产生额外的空文件)。
  • maxArchiveFiles - 保留多少归档文件。

使用 NLog 4.5(或更新版本)时,以下内容应该有效:

fileName="${basedir}/logs/Log_${shortdate}.log"
archiveAboveSize="10000000"
maxArchiveFiles="50"