如何通过进程ID设置滚动文件名唯一

How to set the rolling file name to be unique by process ID

我试图在一台机器上同时为每个进程 运行 在日志中设置唯一的名称。我试图将 app.config 中的 pathFormat 设置为类似于

的内容
<add key="MyApp:serilog:write-to:RollingFile.pathFormat" 
     value="..\log\MyApp.{MachineName}-{ThreadId}-{Date}.log" />

那没用。

有什么想法吗?我在文档中找不到任何内容。


如果能够从多个源写入输出,那么就没有必要为每个进程都创建一个日志。由于(目前)我坚持使用 1.5,因此我在配置 Rolling 文件时提供了一个特定的路径。

 new LoggerConfiguration()
     .ReadFrom.AppSettings(AppName)
     .WriteTo.RollingFile(path)

我只需要提供机器名称和线程 ID 即可获得唯一的日志文件名称。

目前Serilog自带的RollingFile sink只支持动态滚动文件的{date}标签

因此,如果您需要不同的(动态)策略来滚动(如线程 ID 等),您将编写自己的接收器(您可以 fork the default one 并进行更改)。

不过对于通常不会经常更改的机器名称,您可以使用环境变量 COMPUTERNAME 并让 Serilog 为您扩展它。

例如

<add key="MyApp:serilog:write-to:RollingFile.pathFormat" 
     value="..\log\MyApp.%COMPUTERNAME%-{Date}.log" />

当然,环境变量会在您初始化 Serilog 配置时扩展,因此如果在您的应用 运行 期间机器名称发生变化,您仍将使用旧版本滚动文件名称,直到您重新启动您的应用程序(或至少直到您的应用程序重新初始化 Serilog)。


ps:不确定是否是 helps,但 Serilog v2.0 引入了一种跨进程共享同一日志文件的方法:

.WriteTo.RollingFile("log-{Date}.txt", shared: true)