web-dev-qa-db-fra.com

Configuration de SeriLog et .NET Core 2.1 HostBuilder

J'utilise la classe HostBuilder .NET Core 2.1 pour configurer et exécuter un serveur GRPC et j'ai du mal à configurer correctement SeriLog afin qu'il soit utilisé par le pipeline de journalisation .NET Core et disponible (via l'injection de dépendances) ailleurs dans mon application.

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;
    }
}

Le problème est que j'ai besoin de l'appel à loggingBuilder.AddSerilog() pour utiliser le singleton ILogger qui a été enregistré avec la configuration des services DI quelques lignes ci-dessus.

Je me rends compte que je pourrais appeler directement BuildLogger() pour obtenir l'instance ILogger et enregistrer cette instance avec la configuration du service DI, mais il semble que je ne devrais pas avoir à le faire. Ce que je recherche, c'est un moyen, à partir de la méthode .ConfigureLogging(), d'accéder à une instance ServiceProvider pour que je puisse obtenir le ILogger enregistré, peut-être comme

serviceProvider.GetRequiredService<ILogger>();

et transmettez-le à l'appel AddSerilog(). Des idées?

9
Mr. T

Ce que je recherche, c'est un moyen, à partir de la méthode .ConfigureLogging (), d'accéder à une instance de ServiceProvider pour pouvoir obtenir l'ILogger enregistré

Vous pouvez accéder à ServiceProvider à partir de la méthode ConfigureLogging() via ILoggingBuilder.Services.BuildServiceProvider(). Ainsi:

//...

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

Essayez le nouveau package maintenant disponible dans 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

Selon la documentation du référentiel pour .NET Core 2.0+, appelez AddSerilog() sur le loggingBuilder fourni et assurez-vous de configurer Serilog en premier:

//...

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