Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# iLogger工厂vs serviceCollection.AddLogging vs WebHostBuilder.ConfigureLogging_C#_Logging_Asp.net Core_.net Core_.net Core Logging - Fatal编程技术网

C# iLogger工厂vs serviceCollection.AddLogging vs WebHostBuilder.ConfigureLogging

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()

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

  • 在生产中使用application insight
  • 开发环境中的控制台和调试记录器
  • 根据类别和日志级别设置一些筛选器
现在,我看到了至少三种不同的API来配置日志记录:

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

    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
    方法首先尝试添加两个singleton
    ILogger工厂
    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>();
            });