Skip to content
返回运维与 SRE

日志告警

按日志模式告警 — 特定错误、错误率和预期日志缺失 — 非仅指标。

为什么

指标告诉你错误率 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 解)避免抖动;合指标和日志告警覆全失败空间。