我在两个 dotNet Core 6 Web api 中使用 Serilog.Enrichers.ClientInfo 作为 Serilog 丰富器。两个 api 都具有相同的 Serilog 包引用,都具有相同的 Serilog 配置。第一个 api 正确记录标头,第二个则不然。这里可能有什么问题?
API 1 配置:
var loggers = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss}] {Level:u3} CLient IP: {ClientIp} Correlation Id: {CorrelationId} header-name: {Host} user: {UserName} {Message:lj}{NewLine}{Exception}")
.Enrich.WithClientIp()
.Enrich.WithCorrelationId()
.Enrich.WithRequestHeader("Host")
.Enrich.WithRequestHeader("UserName")
.Enrich.WithRequestHeader("another-header-name", "SomePropertyName")
.CreateLogger();
builder.Host.UseSerilog(loggers);
//
var app = builder.Build();
app.UseSerilogRequestLogging();
Api 1 控制器测试:
public async Task<IActionResult> Get(int id)
{
logger.LogInformation("CONTROLLER-1 TEST LOG");
var getExamCommand = new GetExamQuery { Id = id };
var exam = await mediator.Send(getExamCommand);
return Ok(exam);
}
Api 1 日志(缺少 Ip、相关性和测试标头名称):
[11:39:50] INF 客户端 IP:相关 ID:标头名称:用户:CONTROLLER-1 测试日志
API 2 配置:
var loggers = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss}] {Level:u3} CLient IP: {ClientIp} Correlation Id: {CorrelationId} header-name: {Host} user: {UserName} {Message:lj}{NewLine}{Exception}")
.Enrich.WithClientIp()
.Enrich.WithCorrelationId()
.Enrich.WithRequestHeader("Host")
.Enrich.WithRequestHeader("UserName")
.Enrich.WithRequestHeader("another-header-name", "SomePropertyName")
.CreateLogger();
builder.Host.UseSerilog(loggers);
Api 2 控制器测试:
public async Task<LoginUserDetails> GetUser(int id)
{
logger.LogInformation("CONTROLLER-2 TEST LOG");
return await userService.Get(id);
}
Api 2 日志(Ip、相关性和测试标头存在(或为空)):
[11:39:34] INF 客户端 IP:::1 相关 ID: null 标头名称: localhost:7082 用户: null CONTROLLER-2 测试日志
两个 API 都引用了这些包:
我只是不明白为什么第一个 api 没有通过请求中存在的标头来丰富。任何帮助将不胜感激。
谢谢。
天啊。如果有人偶然发现这一点 - 不要忘记添加 builder.Services.AddHttpContextAccessor();在你的 DI 中。我花了 2 天时间编写自定义日志丰富器来了解发生了什么:)