Serilog.Enrichers.ClientInfo 未记录请求标头

Serilog.Enrichers.ClientInfo not logging request headers

提问人:lasjan 提问时间:11/15/2023 更新时间:11/15/2023 访问量:26

问:

我在两个 dotNet Core 6 Web API 中使用 Serilog.Enrichers.ClientInfo 作为 Serilog 扩充器。两个 API 都具有相同的 Serilog 软件包引用,并且都具有相同的 Serilog 配置。一个 api 是 loggnig 标头正确,第二个 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 CLient IP:相关 ID:标头名称:用户:控制器 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、correlaion 和 test 标头(或 null)):

[11:39:34] INF CLient IP: ::1 相关 ID: null 标头名称: localhost:7082 用户: null CONTROLLER-2 测试日志

两个 API 都引用了这些包:

api packages

我只是想不通为什么第一个 api 没有用请求中存在的标头来丰富。任何帮助将不胜感激。

谢谢。

.net-core 日志记录 asp.net-core-webapi serilog

评论


答:

0赞 lasjan 11/15/2023 #1

我的天啊。如果有人会偶然发现这一点 - 不要忘记添加构建器。Services.AddHttpContextAccessor();在你的 DI 中。我花了 2 天时间编写自定义日志丰富器来了解发生了什么:)