Kang YiKai

漫游日志

· 4 min read

除了询问资深程序员和源代码,日志(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.traceIdjson.trace.trace_id 的区别么?

其实,只有你看得懂的参数,才有意义。

优先关注常识和看得懂的值,比如关注时间戳、服务名、错误堆栈(Stack Trace)以及具有明确业务含义的 Request Body。

如果不懂的参数,尝试通过「对比与关联」学习:

例如,从其它地方看到的 pod 能够在 log 中找到;虽然 key 不同,但是平台 A 的日志 ID 作为 value 可以在平台 B 找到;你不清楚这个 ID 的作用,但能通过筛选得到系列日志,通过这个系列,从而判断该 ID 的作用。

有意义的日志

日志的 message 部分是最直观的,它往往能提供直接的定位线索。

有时候,你可能读得懂日志里的每一个字,却不知道它背后的真正意图。这时可以尝试通过日志中的文字特征,反向查找代码位置。看看这行日志是在什么条件下被触发的,从而了解背后真正发生了什么。

终极目标:讲述一个正确的故事

零散的日志最终都需要被整合,不论是使用人脑还是什么 AI 工具。我们通过这些碎片信息推测系统状态,目标只有一个:还原出系统运行的完整故事。

如何讲述一个逻辑自洽的故事,是一项非常重要的能力。你可以尝试去阅读那些 ” 好故事 “(成功的案例)作为参考,通过对比,就有机会发现那些 ” 坏故事 ” 究竟在哪些环节上出现了错误。

提升效率

据我估测,灵活的查询并使用日志,可以极大地提升团队合作效率。

记得我不熟悉日志系统时,总需要资深同事带着探索两三次,每次都要耗费 3 到 6 个小时。而当我学会自主探索后,我可以提前获取所有相关信息,推演假设,记录下业务相关的问题。在这个阶段,即使编造出一个 ” 错误的故事 ” 也没关系。

当做好了充足准备,再约同事复核。你一步步讲述你的假设和故事,同事只需给出反馈和纠正。同样的事情,可能 1 到 2 个小时就能解决,极大的提升了效率。

感谢您的阅读!您的支持是我的动力。

如果您喜欢这篇文章,不妨请我喝杯咖啡。 ☕️

wechat