.NET Core 2.1 HostBuilderクラスを使用してGRPCサーバーを設定および実行していますが、。私のアプリ。
_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;
}
}
_
問題は、数行上のDIサービス構成で登録されたシングルトンILogger
を使用するためにloggingBuilder.AddSerilog()
の呼び出しが必要なことです。
BuildLogger()
を直接呼び出してILogger
インスタンスを取得し、そのインスタンスをDIサービス構成に登録できることを理解していますが、そうする必要はないようです。私が探しているのは、.ConfigureLogging()
メソッド内からServiceProvider
インスタンスにアクセスする方法で、登録済みのILogger
を取得できます。
_serviceProvider.GetRequiredService<ILogger>();
_
それをAddSerilog()
呼び出しに渡します。何か案は?
私が探しているのは、.ConfigureLogging()メソッド内からServiceProviderインスタンスにアクセスして登録済みのILoggerを取得する方法です
ConfigureLogging()
経由でILoggingBuilder.Services.BuildServiceProvider()
メソッド内からServiceProvider
にアクセスできます。そのようです:
//...
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(
loggingBuilder
.Services.BuildServiceProvider().GetRequiredService<ILogger>(),
dispose: true));
await hostBuilder.RunConsoleAsync();
}
...//
Serilogで利用できるようになった新しいパッケージを試してください- https://github.com/serilog/serilog-extensions-hosting 。
public static IHost BuildHost(string[] args) =>
new HostBuilder()
.ConfigureServices(services => services.AddSingleton<IHostedService, PrintTimeService>())
.UseSerilog() // <- Add this line
.Build();
.NET Core 2.0+のレポに関するドキュメントによると、提供されたloggingBuilder
でAddSerilog()
を呼び出し、最初にSerilogを構成するようにしてください:
//...
private static async Task Main(string[] args) {
Log.Logger = new LoggerConfiguration()
//...
.CreateLogger();
var hostBuilder = new HostBuilder()
.ConfigureServices((hostContext, services) => {
services.AddLogging(loggingBuilder =>
loggingBuilder.AddSerilog(dispose: true));
// other services here
});
await hostBuilder.RunConsoleAsync();
}
//...