Asp.net-Core

ASP.NET Core 中的 Serilog DI,要注入哪個 ILogger 介面?

  • April 24, 2020

語境

我已經在我的 ASP.NET Core 應用程序中成功配置了 Serilog,只剩下 DI 部分。

問題

現在我有兩個 ILogger 介面,一個Serilog.ILoggerMicrosoft.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.Errorvs log.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 ) ,那麼像上面所做的那樣註冊為單例是正確的- 這沒有錯。

引用自:https://stackoverflow.com/questions/61411759