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

Posted

技术标签:

【中文标题】NLog 文件名中的日期并限制日志文件的数量【英文标题】:Date in NLog file name and limit the number of log files 【发布时间】:2017-10-27 15:00:38 【问题描述】:

我想通过 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 解决这个问题吗?

【问题讨论】:

【参考方案1】:

当使用 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 - 必须与 $date:format=fileName 匹配(因此,如果需要更改,请记住更正这两种日期格式) archiveNumbering=Date - 配置归档清理以支持将文件名解析为日期。 archiveEvery=Year - 激活归档清理,也激活归档文件操作。因为配置的fileName 自动确保存档文件操作,所以我们不想要任何额外的存档操作(例如避免在午夜生成额外的空文件)。 ma​​xArchiveFiles - 要保留多少存档文件。

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

【讨论】:

确实适用于 4.4。我希望到 archiveEvery=Year 过去时,我将升级到 4.5 :)

以上是关于NLog 文件名中的日期并限制日志文件的数量的主要内容,如果未能解决你的问题,请参考以下文章

NLog 实现日志输出到文件详细步骤

Nlog不会写入Windows服务中的日志文件

如何限制 Apache 访问日志的大小,并限制它保留的归档日志的数量?

日志文件中缺少 NLog 记录器名称,您知道原因吗?

NLog记录日志到Oracle数据库

NLog日志框架使用探究