正确的方法来从多台计算机上使用Serilog滚动文件接收器

时间:2019-05-29 21:27:34

标签: c# asp.net-core .net-core serilog

我正在使用Serilog.Sinks.RollingFile,最近不推荐使用Serilog.Sinks.File,而我希望很快会升级。

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

有2个问题。

  1. 如何解决以不同行结尾的片段的问题。还是这个问题是一次从多台机器写入文件所固有的?

  2. 如果这是较新的库

enter image description here

"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
        }
      }
    ]
  }

1 个答案:

答案 0 :(得分:2)

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

不幸的是,这需要大量打开和关闭文件,这非常慢,并且需要序列化工作,随着机器数量的增加,这会产生成本。 Serilog目前未实现此功能,因为它的功能之一似乎可以在测试中使用,但在生产中却表现不佳。

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