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

问题描述 投票:1回答:2

上下文

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

疑问

现在我有两个ILogger接口,一个是 Serilog.ILogger 其二 Microsoft.Extensions.Logging.ILogger. 两种工作方式都是基于我的Serilog配置,我不知道该用哪个?(我的意思是,在Serilog配置到位后,我不知道该用哪种。Microsoft.Extensions.Logging.ILogger 也正确地通过Serilog记录,所以我的配置得到了尊重)

如果 Microsoft.Extensions.Logging.ILogger 我知道如何配置DI使其工作,但在以下情况下,我知道如何配置DI Serilog.ILogger 我看到Serilog有一个静态的Log.Logger实例(可能是一个单例)。

我不想在我的代码中使用这个静态属性,主要是出于测试的原因,所以我想构造函数注入它。解决方案是

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

...但我担心在Web应用程序中使用这个单人,因为很多线程会同时使用同一个实例。它是线程安全的吗?如果不安全,那有什么办法可以解决呢?Serilog.ILogger 与DI?

asp.net-core dependency-injection serilog
2个回答
2
投票

选择使用哪个接口 在您的应用程序中 是一个口味的问题,真的。如果你喜欢Serilog的 ILogger 更短的方法名称(例如 log.Error vs log.LogError),就用这个,否则就用微软的通用的 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>();
    // ...
}

如果你正在开发一个库 不过,我建议使用微软的通用的 ILogger<>当然,不是把依赖性放在了 Serilog 并迫使你的库的消费者也对你的库产生依赖。Serilog.


Log.Logger 是线程安全的,因此,如果你想让所有的类共享同一个实例,那么像上面这样注册为单人是正确的(SourceContexts)--没有什么问题。


1
投票

你应该在你的 Program.cs 文件作为 Host 文件中描述的设置(https:/github.comserilogserilogwikiGetting-Started。).

你不应该手动添加任何东西到你的 ServiceCollection 如上图所示。

对于DI,你应该注入微软通用的 ILogger<> 如文件中所述(https:/docs.microsoft.comen-usaspnetcorefundamentalslogging#cake-logs。). 这 ILogger<> 实例将自动登录到 您所配置的提供商(这可能包括 Serilog,也可能包括任何其他配置的记录器,如文件、控制台等)。

© www.soinside.com 2019 - 2024. All rights reserved.