NLog 文件名中的日期和限制日志文件的数量

Date in NLog file name and limit the number of log files

我想使用 NLog 实现滚动文件的以下行为:
1.防止在启动新文件时重命名或移动文件,并且
2. 限制旧日志文件的总数或大小以避免随着时间的推移出现容量问题

第一个要求可以实现,例如通过在文件名中添加 ${shortdate} 之类的时间戳。示例:

logs\trace2017-10-27.log <-- today's log file to write   
logs\trace2017-10-26.log  
logs\trace2017-10-25.log  
logs\trace2017-10-24.log <-- keep only the last 2 files, so delete this one 

然而,根据其他帖子,不可能在文件名中使用日期和像 maxArchiveFiles 这样的存档参数。如果我使用 maxArchiveFiles,我必须保持日志文件名不变:

logs\trace.log <-- today's log file to write   
logs\archive\trace2017-10-26.log  
logs\archive\trace2017-10-25.log  
logs\archive\trace2017-10-24.log <-- keep only the last 2 files, so delete this one 

但在这种情况下,每天第一次写入时,它会将昨天的跟踪移动到存档并开始一个新文件。

我想阻止移动跟踪文件的原因是因为我们使用 Splunk 日志监视器,它正在监视日志文件夹中的文件以获取更新、读取新行并将其提供给 Splunk。

我担心的是,如果我在 23:59:59.567 处写入了一个事件,那么 00:00:00.002 处的下一个事件会在日志监视器能够读取之前清除之前的内容几分之一秒。

老实说,我还没有测试过这种情况,因为设置起来会很复杂,因为我的团队没有 Splunk 等 - 所以如果这不可能发生,请纠正我。

另请注意,我知道可以通过网络连接等其他方式直接为 Splunk 提供数据,但我们公司当前的 Splunk 设置是从日志文件中读取,因此这样会更容易。

知道如何使用 NLog 解决这个问题吗?

使用 NLog 4.4(或更早版本)时,您必须进入万圣节模式并进行一些欺骗。

此示例在同一文件夹中生成每小时日志文件,并确保在 840 小时(35 天)后执行存档清理:

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

使用 NLog 4.5(仍处于测试阶段),那么它会容易得多(因为只需要指定 MaxArchiveFiles)。另见 https://github.com/NLog/NLog/pull/1993