2016-08-29 63 views
1

我想在日誌上有一個機器上同時運行的每個進程的唯一名稱。我試圖將app.config中的pathFormat設置爲類似於如何設置滾動文件名是唯一的進程ID

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

這沒有奏效。

有什麼想法?我在文檔中找不到任何東西。


能夠寫入來自多個來源的輸出將不必爲每個進程記錄日誌。由於(現在)我堅持1.5,我在配置滾動文件時提供了一個特定的路徑。

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

我只需要提供機器名稱和線程ID以獲取唯一的日誌文件名稱。

+1

(Serilog貢獻者這裏) - 只是好奇,爲什麼你被卡住與1.5?在.NET 4.0上?謝謝! :-) –

回答

2

目前,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:不知道是否有幫助,但Serilog V2.0引入了共享跨進程相同的日誌文件的方式:

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