name: 日志分析 description: 分区优先的日志分析方法论。用于日志搜索、错误分析、跨 Datadog、CloudWatch 或 Kubernetes 日志的模式查找。
日志分析方法论
核心哲学:分区优先
绝不从阅读原始日志样本开始。
日志可能令人不知所措。分区优先的方法防止:
- 只见树木不见森林
- 浪费时间在不相关数据上
- 用噪音淹没上下文
四步过程
步骤1:获取统计信息
在任何日志搜索之前,了解情况:
CloudWatch Insights:
# 有多少错误?
filter @message like /ERROR/
| stats count(*) as total
# 随时间错误率
filter @message like /ERROR/
| stats count(*) by bin(5m)
# 错误类型?
filter @message like /ERROR/
| parse @message /(?<error_type>[\w.]+Exception)/
| stats count(*) by error_type
| sort count desc
Datadog:
# 按服务错误分布
service:* status:error | stats count by service
# 错误类型
service:myapp status:error | stats count by @error.kind
要回答的问题:
- 错误总量是多少?
- 是增加、稳定还是减少?
- 有哪些独特错误类型?
- 哪些服务/主机受影响?
步骤2:识别模式
寻找相关性:
时间模式:
- 错误是否在特定时间开始?
- 是否有周期性(每小时、每天)?
- 与部署或流量峰值相关?
服务模式:
- 是否有一个服务是源头?
- 错误是否跨服务传播?
错误模式:
- 最常见的错误是什么?
- 错误是聚集还是分散?
步骤3:策略采样
只有现在才阅读实际日志样本:
从异常中采样:
- 获取峰值错误时间的日志
- 获取正常时间的日志进行比较
按错误类型采样:
- 获取每种不同错误类型的示例
- 限制为每种5-10个
围绕事件采样:
- 部署前/后的日志
- 特定事件时间戳周围的日志
步骤4:与事件关联
将日志连接到系统变更:
# 使用 git_log 查找最近部署
git_log --since="2小时前"
# 为 K8s 使用 get_deployment_history
get_deployment_history deployment=api-server
# 比较变更前后的日志模式
平台特定提示
CloudWatch Insights
最佳实践:
# 始终包含时间过滤器
filter @timestamp > ago(1h)
# 使用 parse 进行结构化提取
parse @message /status=(?<status>\d+)/
# 显示前聚合
stats count(*) by status | sort count desc | limit 10
常用查询:
# 延迟分布
filter @type = "REPORT"
| stats avg(@duration) as avg,
pct(@duration, 95) as p95,
pct(@duration, 99) as p99
# 带上下文的错误消息
filter @message like /ERROR/
| fields @timestamp, @message
| sort @timestamp desc
| limit 20
Datadog 日志
查询语法:
# 按服务和状态过滤
service:api-gateway status:error
# 字段查询
@http.status_code:>=500
# 通配符
@error.message:*timeout*
# 时间比较
service:api (now-1h TO now) vs (now-25h TO now-24h)
Kubernetes 日志
明智使用 get_pod_logs:
- 始终指定
tail_lines(默认: 100) - 过滤到多容器pod中的特定容器
- 先使用
get_pod_events处理崩溃/重启
要避免的反模式
- 转储所有日志 - 绝不请求无限制日志查询
- 从样本开始 - 始终先获取统计信息
- 忽略时间窗口 - 缩小到事件窗口
- 缺失关联 - 始终连接到部署/变更
- 单服务焦点 - 检查上游/下游服务
调查模板
## 日志分析报告
### 统计信息
- 时间窗口: [开始] 到 [结束]
- 总日志量: X 事件
- 错误计数: Y 事件 (Z%)
- 错误率趋势: [增加/稳定/减少]
### 顶级错误类型
1. [错误类型1]: N 次发生 - [描述]
2. [错误类型2]: M 次发生 - [描述]
### 时间模式
- 错误开始于: [时间戳]
- 相关性: [部署 X / 流量峰值 / 外部事件]
### 样本错误
[引用2-3个代表性错误消息]
### 根本原因假设
[基于模式,可能的原因是什么?]