我的asp.net core 2.x app有典型的日志记录要求:
现在我看到至少有三种不同的API来配置日志记录:
WebHostBuilder.ConfigureLogging()
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();
}
将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));
}
:
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(logging =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddAzureWebAppDiagnostics();
}
}
那些有什么区别?何时使用哪个?
答案 0 :(得分:5)
第三个使用ConfigureServices
,这是WebHostBuilder
中的公共方法。第一个使用ConfigureLogging
,这是HostingHostBuilderExtensions
中IHostBuilder
的扩展方法之一。
他们都在IServiceCollection
包下的LoggingServiceCollectionExtensions
中调用AddLogging
的扩展方法Microsoft.Extensions.Logging
。 AddLogging
方法首先尝试添加两个单例ILoggerFactory
和ILogger<>
以及一个LoggerFilterOptions
的可枚举。然后执行日志记录操作(ILoggingBuilder
),最终调用AddProvider
方法以添加由这些提供程序(控制台,Azure)实现的日志提供程序,并调用SetMinimumLevel
以添加LoggerFilterOptions
第二种方法直接将日志提供程序添加到LoggerFactory
。当调用日志记录方法时,会在LoggerFactory
中调用这些提供程序。
对于订单,第二和第三种方法由WebHostBuilder
UseStartup<TStartup>
方法调用。
答案 1 :(得分:5)
在ASP.NET Core 3.x中,第一个示例现在是背书选项。如the documentation
所述public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
另一个更改是,不再支持在Startup.ConfigureServices方法中完成DI容器设置之前写入日志:
也不支持在主机构建期间进行日志记录(因为尚未设置DI容器),文档建议创建一个separate logger for that case。