![](/img/trans.png)
[英]DI ILogger with Serilog on Webapi 2 running Asp.Net Core 2
[英]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.Error
與log.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.