web-dev-qa-db-ja.com

SeriLogおよび.NET Core 2.1 HostBuilder構成

.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()呼び出しに渡します。何か案は?

9
Mr. T

私が探しているのは、.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();
}

...//
8
Corbett Stevens

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();
11
merbla

.NET Core 2.0+のレポに関するドキュメントによると、提供されたloggingBuilderAddSerilog()を呼び出し、最初に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();
}

//...
3
Nkosi