ILoggerFactory vs serviceCollection.AddLogging vs WebHostBuilder.ConfigureLogging

Lie*_*ero 20 c# logging .net-core asp.net-core .net-core-logging

我的asp.net core 2.x app有典型的日志记录要求:

  • 在生产中使用应用洞察力,
  • 开发环境中的控制台和调试记录器
  • 根据类别和日志级别设置一些过滤器

现在我看到至少有三种不同的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();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 注入ILoggerFactoryStartup.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));
        }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在Startup.ConfigureServices中:

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

那些有什么区别?什么时候用哪个?

Bjo*_*cke 10

在 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>();
        });
Run Code Online (Sandbox Code Playgroud)

另一个变化是不再支持在 Startup.ConfigureServices 方法中完成 DI 容器设置之前写入日志:

  • 不支持将 Logger 注入到 Startup 构造函数中。
  • 不支持将 Logger 注入 Startup.ConfigureServices 方法签名

也不支持在主机构建期间进行日志记录(因为尚未设置 DI 容器),文档建议为这种情况创建一个单独的记录器


Fei*_*hou 9

第三种用法ConfigureServices是的公共方法WebHostBuilder。而第一个用途ConfigureLoggingIHostBuilder的扩展方法之一HostingHostBuilderExtensions

并且它们都在under 包中调用IServiceCollection的扩展方法。该方法首先尝试将两个单和和的枚举。然后做动作的记录()的最后调用的方法添加由这些供应商(控制台,天青),并调用执行日志商加入AddLoggingLoggingServiceCollectionExtensionsMicrosoft.Extensions.LoggingAddLoggingILoggerFactoryILogger<>LoggerFilterOptionsILoggingBuilderAddProviderSetMinimumLevelLoggerFilterOptions

第二种方法直接将日志提供程序添加到中LoggerFactory。这些提供者被称为LoggerFactory当日志记录方法时,将调用。

至于订单,第二和第三种方法由WebHostBuilderUseStartup<TStartup>方法调用。

  • 这回答了问题的第一部分(两者之间有什么区别?),但没有回答第二部分(何时使用哪个?)。Kirk Larkin在他的评论中回答了第二部分:ASP.NET Core 2.0中将#1添加到了替换#2,因为它可以更早地设置日志记录。 (2认同)