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

abx*_*x78 2 c# serilog

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

<add key="MyApp:serilog:write-to:RollingFile.pathFormat" 
     value="..\log\MyApp.{MachineName}-{ThreadId}-{Date}.log" />
Run Code Online (Sandbox Code Playgroud)

那行不通。

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


能够从多个源写入输出将不需要为每个进程都记录日志。由于(目前)我坚持使用 1.5,因此我在配置滚动文件时提供了特定路径。

 new LoggerConfiguration()
     .ReadFrom.AppSettings(AppName)
     .WriteTo.RollingFile(path)
Run Code Online (Sandbox Code Playgroud)

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

Cai*_*ete 6

目前,Serilog自带的RollingFile接收器{date}仅支持动态滚动文件的标签。

因此,如果您需要一种不同的(动态)策略来滚动(如线程 ID 等),您将编写自己的接收器(您可以分叉默认的接收器并进行更改)。

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

例如

<add key="MyApp:serilog:write-to:RollingFile.pathFormat" 
     value="..\log\MyApp.%COMPUTERNAME%-{Date}.log" />
Run Code Online (Sandbox Code Playgroud)

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


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

.WriteTo.RollingFile("log-{Date}.txt", shared: true)
Run Code Online (Sandbox Code Playgroud)