深色模式
日志与链路关联 TraceID
一个请求跨多个服务,光看单机日志很难拼出全貌。给每条日志带上
trace_id,就能从链路追踪系统一键跳到全部相关日志。本文讲怎么埋点、采集与联动。
适用环境
bash
# 确认应用已接入 OpenTelemetry / Jaeger 等追踪
curl -s http://localhost:4318/ >/dev/null && echo "otel-collector ok"
# 准备一条带 trace_id 的日志样本
echo '{"ts":"...","level":"info","trace_id":"4bf92f3577b34da6","msg":"call db"}'1
2
3
4
2
3
4
操作步骤
1. 在代码中生成并透传 TraceID
python
# 用 OpenTelemetry 获取当前 span 的 trace_id
from opentelemetry import trace
span = trace.get_current_span()
trace_id = format(span.get_span_context().trace_id, '016x')
logger.info({"trace_id": trace_id, "msg": "call db"})1
2
3
4
5
2
3
4
5
2. 日志输出 JSON 并保留字段(见结构化日志章节)
json
{"level":"info","trace_id":"4bf92f3577b34da6","service":"order","msg":"call db"}1
3. 采集端把 trace_id 设为可检索字段
yaml
# Filebeat:让 JSON 字段落到根级
parsers:
- ndjson: { keys_under_root: true }
# Loki:把 trace_id 作为标签需谨慎(高基数),建议仍放日志行用 |= 过滤1
2
3
4
2
3
4
4. Grafana 中联动跳转
在 Loki 数据源配置「Trace」链接,Discover 里点 trace_id 即可跳到 Tempo/Jaeger 看完整链路。
验证
bash
# 按 trace_id 拉取全部相关日志
curl -s -G 'http://localhost:3100/loki/api/v1/query_range' \
--data-urlencode 'query={app="order"} | trace_id=`4bf92f3577b34da6`'1
2
3
2
3
常见坑
WARNING
trace_id 是高基数字段,千万别直接当 Loki 标签或 ES 的 keyword 聚合维度,否则索引爆炸。把它当普通可搜索字段即可。
DANGER
若只在入口服务打 trace_id,下游服务不传递,关联就断链。必须保证 trace_id 在 RPC 头(如 W3C traceparent)中全链路透传。