深色模式
日志告警
与其等人发现报错,不如让系统盯着错误日志:当某错误在窗口内超过阈值就发通知。本文用 Loki + Grafana Alerting 和 ES + Elastalert 两种方案演示。
适用环境
bash
# 确认 Loki / Grafana 可访问
curl -s http://localhost:3100/ready
curl -s http://localhost:5601/api/status >/dev/null && echo "kibana ok"1
2
3
2
3
操作步骤
1. Loki + Grafana 告警规则
yaml
# 在 Grafana 中建 alert rule,表达式:
count_over_time({app="nginx"} |= "error" [5m]) > 101
2
2
条件:5 分钟内 error 超过 10 条 → 触发,通知到 Webhook/钉钉/Slack。
2. ElasticSearch + Elastalert(YAML 规则)
yaml
# rules/error_freq.yaml
name: nginx-error-spike
type: frequency
index: logs-app-*
num_events: 10
timeframe:
minutes: 5
filter:
- term: { level: "error" }
alert:
- "post to slack"1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
3. 用 Vector 直接发告警事件
toml
[transforms.alert]
type = "threshold"
inputs = ["parse"]
threshold = 10
window = { seconds = 300 }1
2
3
4
5
2
3
4
5
WARNING
阈值太低会产生「告警风暴」;太高又漏报。建议先观察历史错误基线,再设 2–3 倍基线的动态阈值。
验证
bash
# 手动制造错误看是否触发
for i in $(seq 1 15); do echo "$(date) error boom" >> /var/log/nginx/access.log; done
# 到 Grafana Alerting 页面查看 rule 状态是否为 "Alerting"1
2
3
2
3
常见坑
DANGER
告警规则的查询时间窗口与数据采集延迟要对齐。若日志有 1 分钟延迟,窗口设 5 分钟才稳妥,否则永远触发不了或漏触发。