LabHub
学习 学习路径 课程

从日志里找原因

把散开的日志捆成因果

在 LabHub 中继续学习

目标

叠加三种不同格式的日志,将分散的事实串联为一条因果链。

为什么重要

从错误日志开始查看很自然,但这等于从故事中间开始阅读。典型的性能劣化过程是:变更 → 部分请求变慢(警告)→ 资源被占用 → 超时(错误)→ 告警。只看错误日志时,只能看到最后两个阶段。因此,应提出的问题不是“错误从什么时候开始”,而是**“从什么时候开始不再正常”**,最早出现警告级别日志的时间就是答案。

本练习还会让你看到平均值的无力。整体平均延迟无法代表任何一个请求,而“超过 1000ms 的请求有多少个”却能立即暴露问题。如果只能提取一个指标,请选择超过阈值的数量,而不是平均值。

三份日志

步骤

  1. 创建 /root/correlate 目录。
  2. 统计 app.jsonllevelerror 的行数,并写入 /root/correlate/error_count.txt
  3. 将错误消息指向的表名写入 /root/correlate/table.txt
  4. 计算所有 latency_ms 的平均值,向下取整为整数后写入 /root/correlate/avg_latency.txt
  5. latency_ms 超过 1000 的请求数量写入 /root/correlate/slow_count.txt
  6. 找出 levelwarn 的最早一行,将其时间以 HH:MM 格式写入 /root/correlate/first_warn.txt
  7. deploy.log 中找出事故前刚刚部署的 payment 服务版本,并写入 /root/correlate/version.txt
  8. /root/correlate/link.md 中整理因果关系。必须包含部署版本、变慢的表、首次警告时间和错误时间。

参考

创建工作目录

创建 /root/correlate 目录。

将结果集中放在 /root/correlate 下。

统计错误日志数量

统计 app.jsonllevelerror 的行数,并写入 /root/correlate/error_count.txt

app.jsonl 每行都是一个 JSON。统计 level 字段为 error 的行。

确定问题所在的表

将错误消息指向的表名写入 /root/correlate/table.txt

答案就在错误消息本身。认真读取一行的 msg 字段。

计算平均延迟

计算所有 latency_ms 的平均值,向下取整为整数后写入 /root/correlate/avg_latency.txt

计算所有 latency_ms 的平均值,并向下取整为整数。该值将与后续步骤形成对比。

统计慢请求数量

latency_ms 超过 1000 的请求数量写入 /root/correlate/slow_count.txt

统计 latency_ms 超过 1000 的请求数量。平均值无法展现的问题会在这里显现。

找出首次警告时间

找出 levelwarn 的最早一行,将其时间以 HH:MM 格式写入 /root/correlate/first_warn.txt

在 level 为 warn 的行中,取最早 ts 的 HH:MM。它早于错误发生时间。

找出事故前部署的版本

deploy.log 中找出事故前刚刚部署的 payment 服务版本,并写入 /root/correlate/version.txt

答案是 deploy.log 中在事故时间之前刚刚部署的 payment 服务版本。

整理因果关系

/root/correlate/link.md 中整理因果关系。必须包含部署版本、变慢的表、首次警告时间和错误时间。

将部署版本、变慢的表、首次警告时间和错误时间汇总到同一份文档中。