除了询问资深程序员和源代码,日志(Logging)是理解服务运行状态最核心的工具。但在庞大的微服务架构中,日志海量且散布各处。如何高效地运用它们?
日志平台的四个维度
面对繁杂的平台,根据它们解决的核心问题,大体可以归为这四类:
| 维度 | 问题 | 方案 |
|---|---|---|
| 构建部署 CI/CD | 关注过程:代码编译部署成功了吗?自动化流程通畅吗? | Jenkins, Concourse |
| 质量和安全 | 关注结果:代码质量扫描、安全性及验收测试通过了吗? | SonarQube, Gradle Report |
| 可观测性 (Observability) | 关注健康度:数据转化为直观图表,系统现在还 ” 活 ” 得好吗? | Grafana |
| 追踪与排查 (Tracing) | 关注记录:出问题时,具体的运行现场是什么样的? | Kibana, Splunk, Dynatrace, CloudWatch |
平台的特性
面对陌生的日志平台,不要试图第一时间理解每个参数的定义。首要任务是学会「搜索」和「看结果」,而不是试图了解每个日志和参数的具体含义。
比如掌握 Kibana 的 KQL 或 Filter、Splunk 的自然语言搜索、AWS Portal 的检索方式,或是 Dynatrace 的分布式追踪视图。工具只是手段,找到信息才是目的。
有意义的参数
日志会记录海量信息,但并非都有价值。
你能分清
json.trace_id,json.traceId和json.trace.trace_id的区别么?
其实,只有你看得懂的参数,才有意义。
优先关注常识和看得懂的值,比如关注时间戳、服务名、错误堆栈(Stack Trace)以及具有明确业务含义的 Request Body。
如果不懂的参数,尝试通过「对比与关联」学习:
例如,从其它地方看到的 pod 能够在 log 中找到;虽然 key 不同,但是平台 A 的日志 ID 作为 value 可以在平台 B 找到;你不清楚这个 ID 的作用,但能通过筛选得到系列日志,通过这个系列,从而判断该 ID 的作用。
有意义的日志
日志的 message 部分是最直观的,它往往能提供直接的定位线索。
有时候,你可能读得懂日志里的每一个字,却不知道它背后的真正意图。这时可以尝试通过日志中的文字特征,反向查找代码位置。看看这行日志是在什么条件下被触发的,从而了解背后真正发生了什么。
终极目标:讲述一个正确的故事
零散的日志最终都需要被整合,不论是使用人脑还是什么 AI 工具。我们通过这些碎片信息推测系统状态,目标只有一个:还原出系统运行的完整故事。
如何讲述一个逻辑自洽的故事,是一项非常重要的能力。你可以尝试去阅读那些 ” 好故事 “(成功的案例)作为参考,通过对比,就有机会发现那些 ” 坏故事 ” 究竟在哪些环节上出现了错误。
提升效率
据我估测,灵活的查询并使用日志,可以极大地提升团队合作效率。
记得我不熟悉日志系统时,总需要资深同事带着探索两三次,每次都要耗费 3 到 6 个小时。而当我学会自主探索后,我可以提前获取所有相关信息,推演假设,记录下业务相关的问题。在这个阶段,即使编造出一个 ” 错误的故事 ” 也没关系。
当做好了充足准备,再约同事复核。你一步步讲述你的假设和故事,同事只需给出反馈和纠正。同样的事情,可能 1 到 2 个小时就能解决,极大的提升了效率。