Serilog控制台未输出渲染后消息仅显示日志模板值如何解决?
Serilog日志仅输出模板不显示渲染值解决方法
- 调整Sink输出配置,你当前的配置未指定消息渲染规则,所以无法输出替换后的实际值。参考修改后的配置:
Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .Enrich.WithElkEnrich(httpContextAccessor) // Elasticsearch Sink增加RenderMessage配置开启消息渲染 .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(elasticsearchSinkOptions.Uri) { // 保留你原有elasticsearchSinkOptions的其他配置 AutoRegisterTemplate = true, IndexFormat = elasticsearchSinkOptions.IndexFormat, // 新增以下配置,开启渲染完整消息 RenderMessage = true, RenderMessageTemplate = true }) // 控制台输出增加outputTemplate配置,指定输出渲染后的消息 .WriteTo.Console( restrictedToMinimumLevel: MinimumLogEventLevel(logOptions.ElkOptions.MinimumConsoleLevel), outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}" ) .CreateLogger();
- 检查日志写入语法,必须使用Serilog原生消息模板语法传参,不要提前用C#字符串插值拼接内容,正确示例如下:
// 正确写法:模板和参数分开传入,Serilog会自动完成值替换渲染 var userId = 2024; var apiPath = "/api/order/list"; Log.Information("用户{UserId}访问接口{ApiPath}", userId, apiPath); // 错误写法:提前用$插值拼接,会丢失模板解析能力 // Log.Information($"用户{userId}访问接口{apiPath}");
- 配置完成后,控制台会直接输出替换后的完整日志内容,Elasticsearch中会新增
RenderedMessage字段存储渲染后的完整日志,原MessageTemplate字段仍会保留原始模板用于日志聚合统计。
内容的提问来源于stack exchange,提问作者mohammadyasin parsi
相关产品推荐
相关产品推荐

