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" } }
配置说明
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}:捕获日志的核心消息部分,不会因为消息里有特殊字符而截断
MDC字段拆分
使用Logstash的kv过滤器,把mdc_raw里的内容按,拆分字段、按=拆分键值对,最终会在Elasticsearch里生成如下独立字段:mdc.X-Span-Exportmdc.methodmdc.X-B3-SpanIdmdc.X-B3-TraceId
这些字段直接就能在Kibana里用于筛选、聚合分析,比如按TraceId追踪全链路日志,按方法名统计接口调用次数等。
额外优化建议
- 如果你的日志里MDC字段的分隔符不是
,,可以调整kv的field_split参数,比如字段间是;就改成field_split => "; " - 可以给
grok添加patterns_dir参数,自定义专属匹配模式,适配更复杂的日志格式 - 在Kibana里可以基于这些拆分后的字段创建可视化面板,比如链路追踪仪表盘
内容的提问来源于stack exchange,提问作者KiKo
相关产品推荐
相关产品推荐

