繁体   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