You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:51:22