我正在使用.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<T>
是 Microsoft.Extensions.Logging 的一部分,而不是 SeriLog。 - Mr. TSeriLog.ILogger
的... - Mr. T