上下文
我已经成功地在我的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?
选择使用哪个接口 在您的应用程序中 是一个口味的问题,真的。如果你喜欢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
是线程安全的,因此,如果你想让所有的类共享同一个实例,那么像上面这样注册为单人是正确的(橆 SourceContext
s)--没有什么问题。
你应该在你的 Program.cs
文件作为 Host
文件中描述的设置(https:/github.comserilogserilogwikiGetting-Started。).
你不应该手动添加任何东西到你的 ServiceCollection
如上图所示。
对于DI,你应该注入微软通用的 ILogger<>
如文件中所述(https:/docs.microsoft.comen-usaspnetcorefundamentalslogging#cake-logs。). 这 ILogger<>
实例将自动登录到 都 您所配置的提供商(这可能包括 Serilog,也可能包括任何其他配置的记录器,如文件、控制台等)。