Serilog 忽略 Microsoft.Extension.Logging 中的 LogLevel

LP1*_*P13 8 c# serilog asp.net-core

我正在使用NET5ASP.NET MVC 应用程序。应用程序正在用于Serilog.AspNetCore 3.4.0日志记录

应用程序设置.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Error"
    }
  },
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console"],
    "WriteTo": [
      {
        "Name": "Console"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

程序.cs

     public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder
                   .UseStartup<Startup>()
                   .ConfigureLogging((hostingContext, logging) =>
                   {
                       logging.ClearProviders();                    
                   })                       
                   .UseSerilog((hostingContext, logging) =>
                   {
                      logging.ReadFrom.Configuration(hostingContext.Configuration);
                   });
            });
Run Code Online (Sandbox Code Playgroud)

我也尝试过

 public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder
                   .UseStartup<Startup>()
                   .ConfigureLogging((hostingContext, logging) =>
                   {
                       logging.ClearProviders();
                       Log.Logger = new LoggerConfiguration()
                       .ReadFrom.Configuration(hostingContext.Configuration)                           
                       .CreateLogger();
                       logging.AddSerilog();
                   });                       
               
            });
Run Code Online (Sandbox Code Playgroud)

问题
我的期望是不会Information显示任何日志,Console因为默认 LogLevel 是Error。然而,这是行不通的。在控制台中,我看到每个请求都被记录,包括Information

在我的整个应用程序中,我使用它Microsoft.Extensions.Logging.ILogger<MyClassName>来记录信息。Info即使 LogLevel 为 ,所有这些语句实际上都在记录Error

看起来 Serilog 忽略了 LogLevel Microsoft.Extensions.Logging

请注意,我可以将 serilog 的restrictedToMinimumLevel属性设置为 Error并停止记录信息。不过我认为 serilog 应该遵循 LogLevelMicrosoft.Extension.Logging

fed*_*dim 6

如果您检查该项目的 Github 页面,它建议您实际删除 appsettings.json 中的标准“Logging”部分:-(

Serilog 的指南

我认为这很糟糕,因为它实际上破坏了与 Microsoft.Extensions.Logging 框架的兼容性(您不能再在不更改 appsettings.json 的情况下更改实际的日志提供程序(Log4Net、NLog、Serilog))。


Gur*_*ron 3

使用MinimumLevel属性:

  "Logging": {
    "MinimumLevel": {
      "Default": "Error"
    }
  }
Run Code Online (Sandbox Code Playgroud)

它还支持类别的覆盖:

  "Logging": {
    "MinimumLevel": {
      "Default": "Error",
      "Override": {
        "System": "Information",
        "Microsoft": "Information",
        "Microsoft.Hosting.Lifetime": "Information",
        "Microsoft.EntityFrameworkCore": "Debug"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • Serilog 从不使用 Microsoft 的配置部分 - 即使在旧版本中也始终位于“Serilog”下。@LP13,您可能会发现旧应用程序中的“AddSerilog()”(将 Serilog 作为 MEL 日志记录框架下的提供程序插入)与“UseSerilog()”(较新的应用程序,在没有 MEL 包装器的情况下通过 Serilog 运行所有日志记录)之间存在差异)。 (2认同)