ILoggerFactory против serviceCollection.AddLogging против WebHostBuilder.ConfigureLogging
У меня есть типичное требование регистрации для моего приложения asp.net core 2.x:
- использовать понимание приложений в производстве,
- консоль и отладчик в среде разработки
- настроить некоторые фильтры на основе категории и уровня журнала
Теперь я вижу как минимум три разных API для настройки ведения журнала:
WebHostBuilder.ConfigureLogging()
в Program.cspublic 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(); }
впрыскивать
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)); }
в 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 еще не настроен), в документации рекомендуется создать отдельный логгер для этого случая.