![](/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.