【发布时间】:2018-11-16 15:01:07
【问题描述】:
我正在使用 .NET Core 2.1 HostBuilder 类来设置和运行 GRPC 服务器,但无法正确配置 SeriLog 以便它被 .NET Core 日志管道使用以及可用(通过依赖注入) 在我的应用程序的其他地方。
class Program
{
private static async Task Main(string[] args)
{
var hostBuilder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<ILogger>(BuildLogger);
// other services here
})
.ConfigureLogging((hostContext, loggingBuilder) =>
loggingBuilder.AddSerilog(dispose: true));
await hostBuilder.RunConsoleAsync();
}
private static ILogger BuildLogger(IServiceProvider provider)
{
// create a (global) logger
Log.Logger = new LoggerConfiguration()
...
.CreateLogger();
return Log.Logger;
}
}
问题是我需要调用loggingBuilder.AddSerilog() 来使用上面几行在DI 服务配置中注册的单例ILogger。
我意识到我可以直接调用 BuildLogger() 来获取 ILogger 实例并将该实例注册到 DI 服务配置中,但似乎我不应该这样做。我正在寻找一种方法,从.ConfigureLogging() 方法中访问ServiceProvider 实例,这样我就可以获得注册的ILogger 可能就像
serviceProvider.GetRequiredService<ILogger>();
并将其传递给AddSerilog() 调用。有什么想法吗?
【问题讨论】:
-
我认为最好使用 ILogger
或 ILoggerFactory。我不是 ILoggerFactory 的忠实粉丝,但对我来说仍然比手动注入 ILogger 更好。第一个价格是 ILogger . -
ILogger 默认未注册,而 ILogger
已注册,我认为这样就可以了。可悲的是,这不是很明显,人们往往会发现困难的方式。 -
@ThulaniChivandikwa
ILogger<T>是 Microsoft.Extensions.Logging 的一部分,而不是 SeriLog。 -
我的回答是专门指 Microsoft.Extensions.Logging。默认情况下,可以解决的是 ILogger
和 ILoggerFactory 实现。我指出手动添加 ILogger(同样是 Microsoft.Extensions.Logging)不是一个好主意。 -
@ThulaniChivandikwa 我的问题是关于
SeriLog.ILogger...
标签: c# serilog .net-core-2.1