ILoggerFactory vs serviceCollection.AddLogging vs WebHostBuilder.ConfigureLogging

时间:2018-06-07 14:38:59

标签: c# logging asp.net-core .net-core .net-core-logging

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

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

现在我看到至少有三种不同的API来配置日志记录:

    Program.cs中的
  1. 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();
    }
    
  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中的
  4. public void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging(logging => 
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
            logging.AddAzureWebAppDiagnostics();
        }
    }
    
  5. 那些有什么区别?何时使用哪个?

2 个答案:

答案 0 :(得分:5)

第三个使用ConfigureServices,这是WebHostBuilder中的公共方法。第一个使用ConfigureLogging,这是HostingHostBuilderExtensionsIHostBuilder的扩展方法之一。

他们都在IServiceCollection包下的LoggingServiceCollectionExtensions中调用AddLogging的扩展方法Microsoft.Extensions.LoggingAddLogging方法首先尝试添加两个单例ILoggerFactoryILogger<>以及一个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容器设置之前写入日志:

  • 不支持将日志记录器注入到Startup构造函数中。
  • 不支持将记录器注入到Startup.ConfigureServices方法签名中

也不支持在主机构建期间进行日志记录(因为尚未设置DI容器),文档建议创建一个separate logger for that case