ILoggerFactory与serviceCollection.AddLogging与WebHostBuilder.ConfigureLogging的区别

57

我的asp.net core 2.x应用程序有典型的日志记录需求:

  • 在生产环境中使用Application Insight,
  • 在开发环境中使用控制台和调试记录器,
  • 基于类别和日志级别设置一些过滤器。

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

  1. Program.cs中的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方法中:

  3. 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));
        }
    
  4. 在 Startup.ConfigureServices 中:

  5. public void ConfigureServices(IServiceCollection services)
    {
        services.AddLogging(logging => 
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
            logging.AddAzureWebAppDiagnostics();
        }
    }
    
    什么是它们之间的区别?何时使用哪个?


7
在ASP.NET Core 2.0中添加了1来代替2,因为它可以更早地设置日志记录。您在哪里看到3? - Kirk Larkin
我已经编辑了第三段代码。不确定在哪里看到的,但智能感应建议它。 - Liero
1
多少而言:当您已经有ConfigureLogging方法时,首选1。请注意,CreateDefaultBuilder具有此方法,但它已经为您配置了日志记录。2可用于从ILoggerFactory获取快速参考。如果您没有这个工厂,则无法这样做。 3用于通过依赖注入在构造函数中拥有一个日志实例。 - zameb
2个回答

33
第三个使用的是ConfigureServices,它是WebHostBuilder中的一个公共方法。第一个使用的是ConfigureLogging,它是HostingHostBuilderExtensions中的IHostBuilder的扩展方法之一。
他们都在Microsoft.Extensions.Logging包下的LoggingServiceCollectionExtensions中调用IServiceCollection的扩展方法AddLoggingAddLogging方法首先尝试添加两个单例ILoggerFactoryILogger<>,以及一个LoggerFilterOptions的可枚举集合,然后对日志(ILoggingBuilder)执行操作,最后调用AddProvider方法添加这些提供程序(控制台、Azure)实现的日志提供程序,并调用SetMinimumLevel添加LoggerFilterOptions
第二种方法是直接将日志提供程序添加到LoggerFactory中。当调用日志方法时,这些提供程序将在LoggerFactory中被调用。
至于订单,第二和第三种方法是由WebHostBuilderUseStartup<TStartup>方法调用的。

7
这回答了问题的第一部分(它们有什么区别?),但没有回答第二部分(使用哪一个的时机是什么?) Kirk Larkin在他的评论中回答了第二部分:#1在ASP.NET Core 2.0中添加以替换#2,因为它可以更早地设置日志记录。 - 0xced
以上提供的所有链接已不再可用。 - Second Person Shooter
1
感谢@TheInventorofGod,它们现在可用。 - Feiyu Zhou

13
在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>();
        });

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

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

在主机构建期间记录日志也不支持(因为DI容器尚未设置),文档建议为此创建一个单独的记录器。 (参见文档)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接