Serilog.Sinks.Map 生成不同的日志条目与具有完全相同的 appsettings.json 的标准 ReadFrom.Configuration

问题描述 投票:0回答:1

我正在跟踪来自热重载任何 Serilog 接收器的代码,结果有一些问题。

我从这个开始:

// Program.cs
builder.Host.UseSerilog( ( context, loggerConfig ) =>
{
    loggerConfig.ReadFrom.Configuration( context.Configuration );
} );

还有两个合并在一起的 appsettings.json 文件...

appsettings.json

"Serilog": {
    "MinimumLevel": {
        "Default": "Information",
        "Override": {
            "FastEndpoints": "Warning",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "6",
            "System.Net.Http": "6",
            "Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware": "6", 
            "System": "Warning"
        }
    }
}

appsettings.Development.json

"Serilog": {
    "MinimumLevel": {
        "Override": {
            "Microsoft.Hosting.Lifetime": "Information",
            "Nexgen.Middleware.NexgenMiddleware": "Warning"
        }
    },
    "WriteTo": {
        "Console": { 
            "Name": "Console",
            "Args": {
                "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
            }
        }
    }
}

在 VS Code 调试中运行它,我得到了我期望的输出:

[15:23:43 INF] Starting Nexgen web host <s:Program>
[15:23:43 INF] Now listening on: https://localhost:7058 <s:Microsoft.Hosting.Lifetime>
[15:23:43 INF] Application started. Press Ctrl+C to shut down. <s:Microsoft.Hosting.Lifetime>
[15:23:43 INF] Hosting environment: Development <s:Microsoft.Hosting.Lifetime>
[15:23:43 INF] Content root path: C:\BTR\Camelot\Websites\Nexgen <s:Microsoft.Hosting.Lifetime>

但是,如果我所做的只是用博客文章中找到的代码替换我的

loggerConfig.ReadFrom.Configuration( context.Configuration );

var configVersion = 0L;
builder.Host.UseSerilog( ( context, loggerConfig ) =>
{
    loggerConfig.WriteTo.Map(
        _ => Interlocked.Read( ref configVersion ),
        ( _, writeTo ) => writeTo.Logger( sub => sub.ReadFrom.Configuration( context.Configuration ) ),
        sinkMapCountLimit: 5
    );
} );

// snipped

var app = builder.Build();

ChangeToken.OnChange<object?>(
    () => app.Configuration.GetReloadToken(),
    _ => Interlocked.Increment( ref configVersion ),
    null
);

发生了一些事情:

  1. 站点启动后,我在控制台中收到约 25 个日志条目。大多数额外的内容都来自
    Microsoft.AspNetCore.*
    来源。
  2. 不遵守
    "Nexgen.Middleware.NexgenMiddleware": "Warning"
    设置,并且
    Information
    项目仍然出现。
  3. 网站运行后,如果我将
    "Nexgen.Middleware.NexgenMiddleware": "Warning"
    切换为
    Information
    并返回警告,我仍然会收到信息日志(请注意,当我更新文件时,configVersion 会增加)。

我什至没有真正进入 appsettings.json 编辑和测试记录器配置重新加载,但即使只是“开始”,使用完全相同的配置也会产生非常不同的结果日志。

serilog serilog-aspnetcore serilog-sinks-map
1个回答
0
投票

这里的问题是最小级别覆盖是在日志管道的最开始应用的,例如

Log.Information()
调用,以确定是否应构造
LogEvent
并进一步通过管道传递。

WriteTo.Logger()
的情况下,子记录器中的级别覆盖是无关紧要的,因为它是外部记录器执行上述过程并确定是否应创建事件。

(我认为博客文章应该指出这个警告,我会在那里进行更新。)

© www.soinside.com 2019 - 2024. All rights reserved.