我正在跟踪来自热重载任何 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
);
发生了一些事情:
Microsoft.AspNetCore.*
来源。"Nexgen.Middleware.NexgenMiddleware": "Warning"
设置,并且 Information
项目仍然出现。"Nexgen.Middleware.NexgenMiddleware": "Warning"
切换为 Information
并返回警告,我仍然会收到信息日志(请注意,当我更新文件时,configVersion 会增加)。我什至没有真正进入 appsettings.json 编辑和测试记录器配置重新加载,但即使只是“开始”,使用完全相同的配置也会产生非常不同的结果日志。
这里的问题是最小级别覆盖是在日志管道的最开始应用的,例如
Log.Information()
调用,以确定是否应构造 LogEvent
并进一步通过管道传递。
在
WriteTo.Logger()
的情况下,子记录器中的级别覆盖是无关紧要的,因为它是外部记录器执行上述过程并确定是否应创建事件。
(我认为博客文章应该指出这个警告,我会在那里进行更新。)