ASP.NET Core 中的 Serilog DI,要注入哪個 ILogger 介面?
語境
我已經在我的 ASP.NET Core 應用程序中成功配置了 Serilog,只剩下 DI 部分。
問題
現在我有兩個 ILogger 介面,一個
Serilog.ILogger是Microsoft.Extensions.Logging.ILogger. 兩者都基於我的 Serilog 配置,我不知道該使用哪個?(我的意思是,在 Serilog 配置到位後Microsoft.Extensions.Logging.ILogger也正確地通過 Serilog 記錄,所以我的配置很榮幸)如果
Microsoft.Extensions.Logging.ILogger我確實知道如何配置 DI 以使其工作。但是,如果Serilog.ILogger我看到 Serilog 有一個靜態 Log.Logger 實例(可能是單例)我不想在我的程式碼中使用這個靜態屬性,主要是出於測試原因,所以我想建構子注入它。解決方案是:
services.AddSingleton(Log.Logger); // Log.Logger is a singleton anyway..但是當許多多個執行緒將同時使用這個完全相同的實例時,我擔心 Web 應用程序中的這個單例。它是執行緒安全的嗎?如果不是,那麼
Serilog.ILogger與 DI 一起使用的解決方案是什麼?
選擇在您的應用程序中使用哪個界面是一個品味問題,真的。如果您更喜歡 Serilog 的
ILogger較短方法名稱(例如log.Errorvslog.LogError),請使用它,否則使用 Microsoft 的通用ILogger<>. 您可以控制您在自己的項目中使用的所有依賴項,因此沒有強有力的技術理由偏愛其中一個。您可能有興趣在 Serilog 的 repo 上閱讀此問題:
我應該使用 Microsoft.Extensions.Logging.ILogger 還是 Serilog.ILogger?.
我個人在我的所有項目中都使用 Serilog
ILogger,不僅因為我更喜歡較短的方法名稱,還因為我不喜歡在每個類的每個建構子中註入記錄器,而且為每個類使用上下文記錄器也很容易Log.ForContext<>,這在解決問題時很有用。例如public class SomeService { private readonly ILogger _log = Log.ForContext<SomeService>(); // ... } public class SomeRepository { private readonly ILogger _log = Log.ForContext<SomeRepository>(); // ... }但是,如果您正在開發一個庫,我當然建議您使用 Microsoft 的 generic
ILogger<>,而不是依賴Serilog並強制您的庫的使用者也依賴Serilog.
Log.Logger是執行緒安全的,因此如果您希望所有類共享同一個實例(沒有SourceContexts ) ,那麼像上面所做的那樣註冊為單例是正確的- 這沒有錯。