這完全沒問題。通常,實例化記錄器很便宜,因此完全可以像執行性能那樣進行。
仍然可以考慮(1)使用Serilog所具有的全局日誌實例,或者(2)使用在字段聲明中初始化的靜態字段。再一次,不是出於性能的原因,而是爲了避免污染你的構造函數而不是相關的東西。
UPD更新關於實施(1)
基本上,它只是一個決定會在哪裏你把記錄器初始化代碼到的問題。在ASP.NET核心將是Main
方法的第一行(即Log
是Serilog
命名空間的靜態類):
Log.Logger = new LoggerConfiguration().WriteTo.LiterateConsole(LogEventLevel.Debug, LogTemplate)
.WriteTo.File(@"C:\logs\elbakogdabot.log", LogEventLevel.Debug, LogTemplate)
.Enrich.FromLogContext()
.CreateLogger();
(僅僅是明確的:我把代碼從我的實際項目,但是記錄器的實際配置可能不同)。
然後我會在任何地方使用它像這樣:
Log.Warning($"got a message for an unknown user: userid=[{userId}]");
此行可能被扔進任何類,你不必做任何額外的初始化這個類。
UPD更新關於執行(2)
我想在一個典型的企業應用程序這將是有問題永遠記得你每次登錄的東西的時候把類名在郵件中。所以我大部分時間都會去static readonly
。隨着Serilog你可以做這樣的:
public class XYZService
{
private static readonly Serilog.ILogger log = Log.ForContext<XYZService>();
...
這樣你既不會污染構造,並會自動在您所有的日誌信息的獲取類名。我曾經在ReSharper片段中有這條線,所以我不得不在每個新班級中輸入lg<TAB>
。
感謝您的快速回復。選項1的任何好的參考文章? – vibs
聽起來不錯。我試圖在我的代碼中實現它。它的工作原理! – vibs
只有兩件事:1)我必須在我的業務庫中安裝serilog nuget軟件包以獲取Log對象的訪問權限2)我的輸出模板格式沒有獲取sourcecontext,因爲它是全局的。所以我們必須在日誌消息中編寫n類方法的詳細信息。如果錯了,糾正我。 – vibs