日志告警
按日志模式告警 — 特定错误、错误率和预期日志缺失 — 非仅指标。
为什么
指标告诉你错误率 0.5%,但日志告诉你为什么 — 且某些失败根本不动指标。每分钟一次的"DB connection refused"错误不破 1% 错误率 SLO,但它是 DB 池耗尽且 SEV1 10 分钟远的先导指标。按日志模式(特定错误消息)告警早抓此,你可修(提池大小)在它成宕机前。日志告警也抓"预期日志缺失"失败模式:若发发票的 cron 24 小时未日志"invoices sent",某物错了,即使无错误被日志。这是指标无法检测的失败模式(无"cron 未跑"指标),但日志可(预期日志未现)。合起指标 + 日志告警覆全失败空间。
何时使用
当你有结构化日志和聚合。为同服务在指标告警旁加日志告警。
如何做
1. 按特定错误消息告警(已知失败模式)
- "DB connection refused" → page(DB 池耗尽,SEV1 迫)
- "OOMKilled" → page(pod OOM,将重启并丢在飞请求)
- 这些抓不动错误率指标的失败
2. 按服务错误率告警(从日志非仅指标)
- rate({service="checkout", level="ERROR"}[5m]) > 1/s → page
- 基日志错误率抓指标管道漏的错误(如被日志非被指标)
3. 按预期日志缺失告警(死人开关)
- "invoices sent" 日志应每 24h 现 → 25h 无则告警
- "health check OK" 日志应每 1m 现 → 5m 无则告警
- 这抓静默失败(cron 未跑、worker 死无错误)
4. 用多窗口告警避免抖动
- 短窗(1m)快检测,长窗(5m)自动解
- 若错误率 >1/s 持续 1m 且 >0.5/s 持续 5m 则告警触发
5. 把日志告警路由到正确响应者
- "DB connection refused" → DB 队值班非 app 值班
- "OOMKilled" → 平台队(资源问题)非 app 队
- 告警注解指定响应者;别全默认一队示例
# 日志告警(Loki + Alertmanager):
groups:
- name: checkout-log-alerts
rules:
# 1. 特定错误消息(已知失败模式)
- alert: CheckoutDbConnectionRefused
expr: count_over_time({service="checkout", msg=~"DB connection refused"}[5m]) > 0
for: 1m
labels: { severity: page, team: db-platform }
annotations:
runbook_url: "https://rb/checkout-db-failover"
# 2. 按服务错误率(从日志)
- alert: CheckoutErrorRateHigh
expr: rate({service="checkout", level="ERROR"}[5m]) > 1
for: 2m
labels: { severity: page, team: payments }
# 3. 预期日志缺失(死人开关)
- alert: InvoiceCronNotRunning
expr: count_over_time({service="billing", msg="invoices sent"}[25h]) == 0
labels: { severity: page, team: billing }
annotations:
summary: "发票 cron 25h 未日志'invoices sent' — 可能死了"
# 4. 多窗口(快检测,慢解)
- alert: CheckoutErrorMultiWindow
expr: |
rate({service="checkout", level="ERROR"}[1m]) > 2
and
rate({service="checkout", level="ERROR"}[5m]) > 0.5
labels: { severity: page, team: payments }
# 覆盖:
# - 指标告警:错误率、延迟、SLO 燃烧("什么")
# - 日志告警:特定错误、死人、基于日志的率("为什么"和静默失败)
# - 合起:全失败空间覆常见问题
- ⚠仅指标告警无日志告警 — 每分钟一次的"DB connection refused"不破 SLO 但是先导指标;日志告警早抓。
- ⚠无死人开关 — cron 静默停且数日无人注意因无错误被日志;按预期"invoices sent"日志缺失告警。
- ⚠所有日志告警路由一队 — "DB connection refused" page 无法修 DB 的 app 队;按告警注解路由到正确响应者。
- ⚠单窗口告警 — 错误率振荡时每 30s 抖开关;用多窗口(1m 检测、5m 解)稳告警。
最佳实践
- ✓按已知失败模式的特定错误消息(DB connection refused、OOMKilled)告警但不动错误率指标。
- ✓按预期日志缺失(死人开关)告警抓静默失败 — cron 未跑、worker 死 无错误。
- ✓经注解把日志告警路由到正确队(DB 错 → DB 队、OOM → 平台队);别全默认一队。
- ✓用多窗口告警(1m 检测、5m 解)避免抖动;合指标和日志告警覆全失败空间。