如何在 nlog 和 nxlog 之间设置容错通道?

How to set a fault tolerante channel between nlog and nxlog?

我的应用程序使用 nlog。它需要将日志发送到同一主机(我也可以控制)中的 nxlog 进程 运行。

我考虑使用 TCP 或 UDP 从 nlog 向 nxlog 发送 json 行。这是一个简单的设计,但它不是容错 AFAIK。如果 nxlog 暂时关闭,nlog 甚至可能会继续重试,但如果我的应用程序在那一刻退出,日志消息就会丢失。

或者我可以设置 nlog 文件目标来写入 json 行。它将用作持久缓冲区。 Nxlog 将从该文件中读取。问题变成了如何设置文件滚动设置。如果我不设置滚动,nlog 可能会在 nxlog 读取最后的日志行之前截断文件。如果我设置滚动,nxlog 会将新的存档文件视为一组新的日志,并且 "replay" 它们会生成重复项。

所以,我的问题是:如何将 nlog 和 nxlog 设置为容错并防止重复?

如果您配置 nlog 每天创建一个日志,即日志文件是在文件名中使用日期创建的并且不会滚动,那么 nxlog 将能够提取文件并且不会有重复文件。

我采纳了 b0ti 的建议,得出了:

var file = new FileTarget
{
    FileName = @"C:\Logs\file.log",
    ArchiveFileName = @"C:\Logs\file.{#}.log",

    ArchiveEvery = FileArchivePeriod.Minute,
    ArchiveAboveSize = 2 * 1024 * 1024,  // 2MB.

    ArchiveNumbering = ArchiveNumberingMode.Sequence,
    MaxArchiveFiles = 60,
};

Nxlog 只监视归档文件:C:\Logs\file.{#}.log

NLog 将每分钟或当它变得足够大时(在上面的示例中为 2MB)为 Nxlog 添加一个新文件。就我而言,这是可以接受的延迟。

如果我的应用程序记录不多,它会保留 1 小时的日志。如果它疯狂地记录日志,历史记录将更短但不会超过 122MB (2 + 2 * 60)。