ASP.NET Core Serilog对接Loggly自定义JSON属性不显示如何解决
解决方案
自定义属性仅出现在Loggly原始消息区域、未被解析到JSON结构化区域的核心原因是Loggly Sink未正确识别全局上下文富集的结构化属性,按以下步骤调整配置即可修复:
- 确认依赖包安装完整
除Serilog.AspNetCore、Serilog.Sinks.Loggly基础包外,必须安装Serilog.Enrichers.GlobalLogContext包。缺失该包时,.Enrich.FromGlobalLogContext()仅能将属性拼接在消息字符串末尾,无法将属性写入日志事件的结构化属性字典,自然不会被Loggly解析为独立JSON字段。 - 调整Serilog初始化逻辑
不要完全依赖配置文件自动加载Sink规则,显式为Loggly Sink开启结构化属性序列化,修改后的初始化代码如下:
.UseSerilog((context, loggerConfiguration) => loggerConfiguration .ReadFrom.Configuration(context.Configuration) .Enrich.FromGlobalLogContext() .WriteTo.Loggly( logglyConfig: context.Configuration.GetSection("Serilog:WriteTo:Loggly:Args").Get<LogglyConfiguration>(), renderMessage: false, serializeProperties: true ))
- 修正appsettings.json中的Loggly配置
确保配置中关闭纯文本消息渲染、开启属性序列化,参考配置片段:
{ "Serilog": { "WriteTo": { "Loggly": { "Name": "Loggly", "Args": { "customerToken": "替换为你的Loggly采集令牌", "applicationName": "替换为你的应用标识", "tags": ["aspnetcore", "service"], "renderMessage": false, "serializeProperties": true, "includeMessageTemplate": true } } } } }
- 校验属性推送代码
调用PushProperty时,如果传入的是值类型、字符串、Guid等简单类型,保持现有写法即可;如果传入的是复杂对象,需要传入第三个参数destructureObjects: true开启解构,否则对象会被默认转成字符串写入原始消息,无法解析为结构化字段:
// 简单类型写法 using (GlobalLogContext.PushProperty("TransactionActivityId", activityId)) { _logger.LogInformation("Test log message"); } // 复杂对象写法 using (GlobalLogContext.PushProperty("TransactionMetadata", metadata, destructureObjects: true)) { _logger.LogInformation("Test log message"); }
配置修改完成后重启应用,发送新的测试日志等待1-2分钟即可在Loggly的JSON区域看到自定义字段。注意旧的历史日志不会被重新解析,只有新产生的日志会生效。
内容的提问来源于stack exchange,提问作者Ian Yang
相关产品推荐
相关产品推荐

