ILoggerFactory против serviceCollection.AddLogging против WebHostBuilder.ConfigureLogging

У меня есть типичное требование регистрации для моего приложения asp.net core 2.x:

  • использовать понимание приложений в производстве,
  • консоль и отладчик в среде разработки
  • настроить некоторые фильтры на основе категории и уровня журнала

Теперь я вижу как минимум три разных API для настройки ведения журнала:

  1. WebHostBuilder.ConfigureLogging()в Program.cs

    public static void Main(string[] args)
    {
        var webHost = new WebHostBuilder()               
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                logging.AddConsole();
                logging.AddDebug();
                logging.AddAzureWebAppDiagnostics();
            })
            .UseStartup<Startup>()
            .Build();
    
        webHost.Run();
    }
    
  2. впрыскивать ILoggerFactory в метод Startup.Configure:

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
    {
        loggerFactory.AddConsole();
        loggerFactory.AddAzureWebAppDiagnostics();
        loggerFactory.AddApplicationInsights(app.ApplicationServices, 
            (category, level) => level >= (category == "Microsoft" ? LogLevel.Error : LogLevel.Information));
        }
    
  3. в Startup.ConfigureServices:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging(logging => 
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
            logging.AddAzureWebAppDiagnostics();
        }
    }
    

В чем разница между этими? Когда использовать что?

1 ответ

Третий использовать ConfigureServices который является публичным методом в WebHostBuilder, И первое использование ConfigurationLogging который является одним из IHostBuilder метод расширения в HostingHostBuilderExtensions,

И они оба называют IServiceCollection метод расширения AddLogging в LoggingServiceCollectionExtensions под Microsoft.Extensions.Logging пакет. AddLogging Метод сначала попробуйте добавить два синглтона ILoggerFactory а также ILogger<> и множество LoggerFilterOptions, Затем выполните действие для входа (ILoggingBuilder) который наконец-то называет AddProvider метод добавления провайдеров журналов, реализованных этими провайдерами (Console, Azure) и вызовов SetMinimumLevel добавить LoggerFilterOptions

Второй метод напрямую добавляет поставщиков журналов в LoggerFactory, И эти провайдеры называются в LoggerFactory при входе в систему вызываются методы.

Что касается заказов, то второй и третий методы вызываются WebHostBuilder "s UseStartup<TStartup> метод.

В ASP.NET Core 3.x первый пример теперь является одобренным вариантом. Как поясняется в документации

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Еще одно изменение заключается в том, что запись журналов до завершения настройки контейнера DI в методе Startup.ConfigureServices больше не поддерживается:

  • Внедрение регистратора в конструктор запуска не поддерживается.
  • Внедрение регистратора в подпись метода Startup.ConfigureServices не поддерживается

Ведение журнала во время построения хоста также не поддерживается (поскольку контейнер DI еще не настроен), в документации рекомендуется создать отдельный логгер для этого случая.

Другие вопросы по тегам