Serilog - MinimumLevel Override 需要使默认有效

Serilog - MinimumLevel Override required to make the default effective

我在这里 What does MinimumLevel and Override mean in appsettings.json logging context? 读到 Default 在 Serilog 中表示 default - 因此,以下配置应该有效:

appSettings.json

"Serilog": {
    "MinimumLevel": {
        "Default": "Warning"
    }
}

然而,使用上面的配置我仍然得到 Information 级别的日志,如下所示:

[11:53:56 INF] Now listening on: http://0.0.0.0:5000
[11:53:56 INF] Application started. Press Ctrl+C to shut down.
[11:53:56 INF] Hosting environment: Development
[11:53:56 INF] Content root path: [some_path]

唯一对我有效的配置是:

"Serilog": {
    "MinimumLevel": {
        "Default": "Warning",
        "Override": {
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Warning"
        }
    }
}

以上,没有显示Information级的日志。这似乎与提到的Whosebug答案和常识相矛盾。

这是我设置记录器的方式:

Log.Logger = new LoggerConfiguration()
                 .ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)
                 .ReadFrom.Configuration(Configuration)
                 .WriteTo.Console(theme: AnsiConsoleTheme.Code)
                 .CreateLogger();

项目使用.NET Core 3.1开发。

我想知道 serilog 是否有什么特殊之处,或者我在配置中遗漏了一些重要步骤?

为了完整起见-这里是Main:

public static void Main(string[] args)
{
    try
    {
        CreateHostBuilder(args).Build().Run();
    }
    catch (Exception exception)
    {
        Log.Fatal(exception, "Host terminated unexpectedly");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

CreateHostBuilder:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog()
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Serilog 在 Startup.csConfigureServices 的第一行使用上述代码 (Log.Logger = ...) 初始化。

经过几个小时的搜索和尝试后,我注意到没有单一来源建议在任何 Startup.cs 方法中初始化 Serilog。

我的解决方案是通过以下方式将初始化移动到 Program.cs

public static void Main(string[] args)
{
    SetupSerilog();
    try
    {
        CreateHostBuilder(args).Build().Run();
    }
    catch (Exception exception)
    {
        Log.Fatal(exception, "Host terminated unexpectedly");
    }
    finally
    {
        Log.CloseAndFlush();
    }
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog()
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

private static void SetupSerilog()
{
    var appsettingsFilename = "appsettings.json";

    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile(appsettingsFilename)
        .AddEnvironmentVariables()
        .Build();

    Log.Logger = new LoggerConfiguration()
        .ConfigureForNodaTime(DateTimeZoneProviders.Tzdb)
        .WriteTo.Console(theme: AnsiConsoleTheme.Code)
        .ReadFrom.Configuration(configuration)
        .CreateLogger();
}

不幸的是,我几乎不明白为什么会这样,以及 Serilog 行为不同的原因是什么,这取决于记录器是在构造函数内部定义的,ConfigureServices 还是 Configure Startup.cs。我最初的想法是可以轻松访问 IConfiguration。尽管如此,也许有人会发现上面的提示很有用。