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

MDC日志值位置变更:如何用Logstash拆分日志字段同步至Kibana

适配你的日志格式的Logstash Grok解决方案

针对你描述的日志格式,我已经帮你设计好了一套精准的Grok过滤配置,能把所有字段(包括MDC里的Span ID、Trace ID等)拆分成独立字段,完美对接Elasticsearch和Kibana:

首先先确认你的日志样本:

2018-03-22 13:17:47 INFO SomeController [X-Span-Export=false, method=someMethod(), X-B3-SpanId=deef3c47193ec4a6, X-B3-TraceId=0cecd4b78e1d8357] - Parameters: [id=40]

完整的Logstash过滤配置

filter {
  grok {
    match => { "message" => "%{DATE:log_date} %{TIME:log_time} %{LOGLEVEL:log_level} %{DATA:logger} \[%{DATA:mdc_raw}\] - %{GREEDYDATA:log_message}" }
    # 合并日期时间为ES标准的@timestamp字段
    add_field => { "@timestamp" => "%{log_date}T%{log_time}" }
    # 删除临时字段,减少冗余
    remove_field => ["log_date", "log_time"]
    # 标记解析失败的日志,方便排查
    tag_on_failure => ["_grokparsefailure"]
  }

  # 拆分MDC里的键值对到独立字段
  kv {
    source => "mdc_raw"
    field_split => ", "
    value_split => "="
    target => "mdc"
  }
}

配置说明

  1. Grok基础解析

    • %{DATE:log_date} %{TIME:log_time}:分别提取日期和时间字段,后续合并成Elasticsearch要求的yyyy-MM-ddTHH:mm:ss格式的@timestamp
    • %{LOGLEVEL:log_level}:自动匹配INFO、WARN、ERROR等标准日志级别
    • %{DATA:logger}:捕获你的控制器名称(比如示例中的SomeController),即使logger名称带特殊字符也能兼容
    • \[%{DATA:mdc_raw}\]:把方括号内的所有MDC内容整体提取为mdc_raw字段,不管内部字段顺序如何都能完整捕获
    • %{GREEDYDATA:log_message}:捕获日志的核心消息部分,不会因为消息里有特殊字符而截断
  2. MDC字段拆分
    使用Logstash的kv过滤器,把mdc_raw里的内容按, 拆分字段、按=拆分键值对,最终会在Elasticsearch里生成如下独立字段:

    • mdc.X-Span-Export
    • mdc.method
    • mdc.X-B3-SpanId
    • mdc.X-B3-TraceId

这些字段直接就能在Kibana里用于筛选、聚合分析,比如按TraceId追踪全链路日志,按方法名统计接口调用次数等。

额外优化建议

  • 如果你的日志里MDC字段的分隔符不是, ,可以调整kv的field_split参数,比如字段间是; 就改成field_split => "; "
  • 可以给grok添加patterns_dir参数,自定义专属匹配模式,适配更复杂的日志格式
  • 在Kibana里可以基于这些拆分后的字段创建可视化面板,比如链路追踪仪表盘

内容的提问来源于stack exchange,提问作者KiKo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:25:54