从多台机器使用 Serilog 进行滚动文件接收的正确方法

Proper way to do rolling file sink with Serilog from multiple machines

我正在使用 Serilog.Sinks.RollingFile, which was recently deprecated in favor of Serilog.Sinks.File,希望我会尽快升级。

现在,我的问题是如何从多台机器(使用新包或旧包)正确地登录到共享日志文件。当 10 个不同的服务器记录到这个单个文件时,有时行的片段会出现在不同的行上。示例和 appsettings.json 如下。

那么 2 个问题。

  1. 如何解决片段在不同行结束的问题。或者这个问题是同时从多台机器写入文件所固有的?

  2. 如果这是更新的库

"Serilog": {
    "WriteTo": [
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "\\server\share\log-{Date}.log",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} | {Level:u3} | {MachineName} | {SourceContext} | {RequestId} | {RequestPath} | {ThreadId} | {Message}{NewLine}{Exception}",
          "shared": true
        }
      }
    ]
  }

generally-accepted 方法是让每个应用程序实例在写入之前对文件进行独占锁定,并在完成后释放它。

不幸的是,这需要大量打开和关闭文件,这非常慢,并且需要序列化工作,随着机器数量的增加会产生成本。 Serilog 目前没有实现这一点,因为它是那些似乎在测试中有效但在生产中表现很差的功能之一。

让每个应用程序实例写入自己的文件是一个更好的方案,但使用 network-based 日志 collector/service 会在较长的 运行.[=10= 中减少麻烦]