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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (11)

我使用Serilog.Sinks.RollingFile,这是最近赞成不赞成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
        }
      }
    ]
  }
提问于
用户回答回答于

通常接受的方法是每个应用程序实例在写入之前对文件进行独占锁定,并在完成后释放它。

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

让每个应用程序实例写入自己的文件是一个更好的方案,但从长远来看,使用基于网络的日志收集器/服务将不那么麻烦。

扫码关注云+社区

领取腾讯云代金券