iris框架需手动注入traceid和service.name:通过中间件提取x-b3-traceid或生成uuid,存入ctx.values();自定义日志函数拼接json,含service、traceid等字段;filebeat启用decode_json_fields解析为扁平字段;es索引模板须预设traceid为keyword类型。

Iris 框架本身不内置 traceId 注入或 JSON 日志能力,必须手动补全上下文字段才能被 ELK 正确聚合。直接用 fmt.Println 或默认 iris.Logger() 输出的日志,在 Kibana 里查不到 service.name、traceId,也做不了跨服务关联。
怎么让 Iris 日志带 traceId 和 service.name
Iris 没有类似 Spring Cloud Sleuth 的自动透传机制,得靠中间件 + 请求上下文手动注入。关键点是:在每个请求进入时生成/提取 traceId,并绑定到 context.Context,再透传给日志写入逻辑。
- 用
middleware提取 HTTP Header 中的X-B3-TraceId(兼容 Zipkin/Sleuth 格式),不存在则用uuid.New().String()生成 - 把
traceId存进ctx.Values().Set("traceId", tid) - 自定义日志封装函数,比如
logRequest(ctx iris.Context, level, msg string),内部调用ctx.Values().GetString("traceId")拼 JSON - 确保最终输出是单行 JSON,字段包括:
service(硬编码或从环境变量读)、traceId、method、path、status、latency、message
Filebeat 怎么解析 Iris 的 JSON 日志
Filebeat 默认把整行当字符串塞进 message 字段,这样 traceId 就只是 message 里的一个子串,无法用于 Kibana 过滤。必须启用 decode_json_fields 处理器,把日志内容解包成 Elasticsearch 的扁平字段。
- 在 Filebeat 配置的
processors下加这段:
processors:
- decode_json_fields:
fields: ["message"]
process_array: false
max_depth: 3
overwrite_keys: true
add_error_key: true
-
fields: ["message"]表示从原始message字段里解析 JSON;如果 Iris 日志已写入文件且每行是完整 JSON,这一步就能把traceId、service等提成独立字段 - 别漏掉
overwrite_keys: true,否则解析后字段名会变成message.traceId而不是顶层traceId - 验证方式:启动 Filebeat 后查 ES,看文档里是否有
traceId字段,类型是不是keyword
Logstash 还要不要?什么情况下可以绕过它
Logstash 对 Iris 这类结构清晰的 JSON 日志不是必需的。如果你没做多源日志混入(比如同时收 Nginx access log + Iris app log),也没做字段重命名、敏感信息脱敏、异常堆栈合并等复杂加工,Filebeat 可直连 Elasticsearch。
- 直连 ES 的配置片段(
filebeat.yml):
output.elasticsearch:
hosts: ["http://es-host:9200"]
index: "iris-logs-%{+yyyy.MM.dd}"
# 必须设 pipeline,否则 ES 不知道怎么处理 @timestamp
pipeline: "iris_pipeline"
- 但注意:ES 需提前建好
ingest pipeline,把timestamp字段转成@timestamp,否则 Kibana 时间筛选会失效 - 如果 Iris 日志里时间字段叫
time,pipeline 内容就得是:{"date": {"field": "time", "formats": ["ISO8601"]}} - Logstash 真正有用的地方是兜底:比如某台机器日志格式错乱、非 JSON 行混入,用 grok + json 过滤器能救回来;否则纯 JSON 场景下,Filebeat 更稳、更轻、更少出错
Kibana 里怎么按 traceId 查全链路
能查的前提是:所有服务(不只是 Iris)都用了同一套 traceId 生成和透传规则,且字段名统一为 traceId(小写,无下划线),类型是 keyword。
- 在 Kibana Discover 页面,输入
traceId: "a1b2c3d4",确认返回结果包含多个service值(如"user-service"、"order-service"、"iris-api") - 如果只看到 Iris 自己的日志,检查其他服务是否漏了
X-B3-TraceId透传,或 Filebeat 是否没开启decode_json_fields - 别用
trace_id或TraceID当字段名——大小写和命名不一致,Kibana 就算写了traceId也匹配不到别的服务 - 时间范围要拉够,有些异步调用延迟高,跨分钟的日志可能被漏掉
最常被忽略的是字段类型:ES 里 traceId 必须是 keyword,不能是 text。一旦 mapping 被自动创建成 text,后续再改要 reindex,Kibana 过滤就完全失效。建索引模板时就得锁死 "traceId": {"type": "keyword"}。











