C# iLogger工厂vs serviceCollection.AddLogging vs WebHostBuilder.ConfigureLogging
我的asp.net core 2.x应用程序有典型的日志记录要求:C# iLogger工厂vs serviceCollection.AddLogging vs WebHostBuilder.ConfigureLogging,c#,logging,asp.net-core,.net-core,.net-core-logging,C#,Logging,Asp.net Core,.net Core,.net Core Logging,我的asp.net core 2.x应用程序有典型的日志记录要求: 在生产中使用application insight 开发环境中的控制台和调试记录器 根据类别和日志级别设置一些筛选器 现在,我看到了至少三种不同的API来配置日志记录: Program.cs中的WebHostBuilder.ConfigureLogging() public static void Main(string[] args) { var webHost = new WebHostBuilder()
- 在生产中使用application insight
- 开发环境中的控制台和调试记录器
- 根据类别和日志级别设置一些筛选器
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();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(logging =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddAzureWebAppDiagnostics();
}
}
它们之间有什么区别?何时使用哪种方法?第三种方法使用
ConfigureServices
,这是中的一种公共方法。第一种方法使用ConfigureLogging
,这是IHostBuilder中的扩展方法之一
它们都在Microsoft.Extensions.Logging
包下调用IServiceCollection
的扩展方法AddLogging
。AddLogging
方法首先尝试添加两个singletonILogger工厂
和ILogger
以及一个可枚举的LoggerFilterOptions
。然后执行日志操作(ILoggingBuilder
),最后调用方法添加由这些提供程序(控制台、Azure)实现的日志提供程序,并调用添加LoggerFilterOptions
第二种方法直接将日志提供程序添加到LoggerFactory
。当调用日志方法时,这些提供程序在LoggerFactory
中被调用
至于订单,第二个和第三个方法由
WebHostBuilder的方法调用。在ASP.NET Core 3.x中,第一个示例现在是认可的选项。正如
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(日志=>
{
logging.ClearProviders();
logging.AddConsole();
})
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
});
另一个更改是,不再支持在Startup.ConfigureServices方法中完成DI容器设置之前写入日志:
- 不支持将记录器注入启动构造函数
- 不支持将记录器注入Startup.ConfigureServices方法签名
主机构造期间的日志记录也不受支持(因为DI容器尚未设置),文档建议创建一个。1已添加到ASP.NET Core 2.0中,以替换2,因为它更早设置了日志记录。你在哪里看过3?我编辑了第三段代码。不确定我在哪里看到它,但我IntelliSense或多或少地建议:如果您已经有了ConfigureLogging方法,则首选1。考虑到CreateDefaultBuilder具有此方法,但它已经为您配置了日志。2可用于从iLogger工厂获取对记录器的快速引用。如果你没有这个工厂,你就不能那样做。3用于通过依赖项注入在构造函数中创建日志实例。这回答了问题的第一部分(它们之间的区别是什么?),但没有回答第二部分(何时使用哪个?)Kirk Larkin在其评论中回答了第二部分:#1添加到ASP.NET Core 2.0中以替换#2,考虑到它更早地设置了日志记录。上面给出的所有链接都不再可用。感谢@theInventorfGod,它们现在可用。
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(logging =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddAzureWebAppDiagnostics();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});