在分布式Go项目中,ELK(Elasticsearch + Logstash + Kibana)与追踪(Tracing)的结合,核心是通过日志与追踪数据的关联(基于trace_id
),实现“从日志定位追踪链路”和“从追踪链路回溯日志”的双向分析能力。以下是具体实现方案:
一、ELK与追踪结合的核心逻辑
ELK收集追踪相关日志的核心是:
- 日志嵌入追踪标识:Go服务的每条日志都包含
trace_id
和span_id
(与OpenTelemetry追踪数据关联) - ELK全链路收集:Filebeat收集包含追踪标识的日志,经Logstash处理后存入Elasticsearch
- Kibana关联分析:通过
trace_id
在Kibana中聚合同一追踪链路的所有日志,并与Jaeger追踪数据联动
整体流程:
[Go服务A] → 输出含trace_id的日志 → [Filebeat] → [Logstash] → [Elasticsearch] → [Kibana]
│
[Go服务B] → 输出含相同trace_id的日志 → ... ─────────────────────┘
│
[Jaeger追踪数据] ────────────────────────────────────────────────┼→ 关联分析(同一trace_id)
二、关键实现步骤
1. Go服务日志嵌入追踪标识
在Go服务中,通过OpenTelemetry从上下文(context.Context
)中提取trace_id
和span_id
,并通过结构化日志库(如zap
)写入日志。
2. Filebeat收集含追踪标识的日志
Filebeat部署在每个服务节点,监控Go服务输出的日志文件(含trace_id
),并转发到Logstash或直接到Elasticsearch。
Filebeat配置(filebeat.yml
)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app.log # 监控Go服务的日志文件路径
tags: ["go-service"] # 标记日志类型
json.keys_under_root: true # 解析JSON日志,将字段提升到根级别
json.overwrite_keys: true # 覆盖默认字段(如@timestamp)
# 输出到Logstash(如需处理日志)或直接到Elasticsearch
output.logstash:
hosts: ["logstash:5044"]