簡體   English   中英

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

[英]Serilog DI in ASP.NET Core, which ILogger interface to inject?

語境

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

問題

現在我有兩個 ILogger 接口,一個是Serilog.ILogger另一個是Microsoft.Extensions.Logging.ILogger 兩者都基於我的 Serilog 配置,我不知道該使用哪個? (我的意思是,在 Serilog 配置到位之后Microsoft.Extensions.Logging.ILogger也正確地通過 Serilog 記錄,所以我的配置很榮幸)

如果Microsoft.Extensions.Logging.ILogger我知道如何配置 DI 以使其工作。 但是在Serilog.ILogger的情況下,我看到 Serilog 有一個 static Log.Logger 實例(可能是單例)

我不想在我的代碼中使用這個 static 屬性,主要是出於測試原因,所以我想構造函數注入它。 解決方案是:

services.AddSingleton(Log.Logger); // Log.Logger is a singleton anyway

..但是當許多多個線程將同時使用這個完全相同的實例時,我擔心 Web 應用程序中的這個 singleton。 它是線程安全的嗎? 如果不是,那么將Serilog.ILogger與 DI 一起使用的解決方案是什么?

選擇在您的應用程序中使用哪個界面是一個品味問題,真的。 如果您更喜歡 Serilog 的ILogger較短的方法名稱(例如log.Errorlog.LogError ),則使用 go ,否則使用 Microsoft 的通用ILogger<> 您可以控制您在自己的項目中使用的所有依賴項,因此沒有強有力的技術理由偏愛其中一個。

您可能有興趣在 Serilog 的 repo 上閱讀此問題:

我應該使用 Microsoft.Extensions.Logging.ILogger 還是 Serilog.ILogger? .

我個人在我的所有項目中都使用 Serilog 的ILogger ,不僅因為我更喜歡較短的方法名稱,還因為我喜歡在每個 class 的每個構造函數中注入記錄器,而且為每個 class 擁有一個上下文記錄器也很容易使用Log.ForContext<> ,這在解決問題時很有用。 例如

public class SomeService
{
    private readonly ILogger _log = Log.ForContext<SomeService>();
    // ...
}

public class SomeRepository
{
    private readonly ILogger _log = Log.ForContext<SomeRepository>();
    // ...
}

但是,如果您正在開發一個庫,我當然建議您使用 Microsoft 的通用ILogger<> ,而不是依賴於Serilog並強制您的庫的使用者也依賴於Serilog


Log.Logger是線程安全的,因此如果您希望所有類共享同一個實例( 沒有SourceContext s ),那么像上面所做的那樣注冊為 singleton 是正確的 - 這沒有錯。

您應該按照文檔 ( https://github.com/serilog/serilog/wiki/Getting-Started ) 中的說明在您的Program.cs文件中設置日志記錄作為Host設置的一部分。

如上所示,您不應手動向ServiceCollection添加任何內容。

對於 DI,您應該按照文檔 ( https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/#create-logs ) 中的說明注入 Microsoft 通用ILogger<> ILogger<>實例將自動記錄到您已配置的所有提供程序(這可能包括 Serilog,但也包括配置的任何其他記錄器,例如文件、控制台等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM