6.4.9 日志监控与告警规则设计
日志监控与告警规则设计应以“采集完整、规则分层、告警分级、可回溯”为主线,围绕可用性、性能、容量与安全四类目标建立基线与阈值。以下给出原理草图、安装与配置示例、命令解释、排错与练习,确保可落地实施。
规则分层与基线设计(核心思路)#
- 基础健康类(P2/P3):日志存在性、更新频率、大小增长、轮转状态、磁盘水位。
- 错误事件类(P1/P2):崩溃恢复、InnoDB异常、连接耗尽、鉴权失败、复制中断。
- 性能事件类(P2/P3):慢查询突增、95/99分位变差、锁等待偏高。
- 安全审计类(P1/P2):高频失败登录、异常授权、敏感表访问、root远程登录。
安装与采集示例(Filebeat 采集 + Elasticsearch 存储 + ElastAlert 规则)#
示例使用 Filebeat 采集 MySQL 日志并输出到 Elasticsearch,再用 ElastAlert 触发告警。
1) 安装 Filebeat(Linux)#
# 以 Debian/Ubuntu 为例
sudo apt-get update
sudo apt-get install -y filebeat
# 启用服务
sudo systemctl enable filebeat
sudo systemctl start filebeat
2) Filebeat 配置(/etc/filebeat/filebeat.yml)#
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/mysql/error.log
- /var/log/mysql/slow.log
- /var/log/mysql/audit.log
fields:
app: mysql
env: prod
fields_under_root: true
output.elasticsearch:
hosts: ["http://es01:9200"]
index: "mysql-logs-%{+yyyy.MM.dd}"
setup.template.enabled: true
setup.ilm.enabled: false
关键点说明:
- paths 指向日志文件路径,确保与实际 MySQL 配置一致。
- fields 添加业务标签,便于规则过滤。
- index 按天分索引,利于归档与回溯。
3) ElastAlert 安装与规则示例#
# 安装 ElastAlert
sudo apt-get install -y python3-pip
pip3 install elastalert
# 初始化配置
elastalert-create-index --config /etc/elastalert/config.yaml
/etc/elastalert/config.yaml:
rules_folder: /etc/elastalert/rules
run_every:
minutes: 1
buffer_time:
minutes: 15
es_host: es01
es_port: 9200
writeback_index: elastalert_status
规则示例1:错误日志关键字告警(P1)
/etc/elastalert/rules/mysql_error_p1.yaml
name: mysql_error_p1
type: any
index: mysql-logs-*
filter:
- query:
query_string:
query: 'app:mysql AND message:("InnoDB corruption" OR "too many connections" OR "Disk is full")'
alert:
- "email"
email:
- "dba@company.com"
alert_subject: "[P1] MySQL严重错误日志告警"
规则示例2:慢查询突增(P2)
/etc/elastalert/rules/mysql_slow_spike.yaml
name: mysql_slow_spike
type: frequency
index: mysql-logs-*
num_events: 50
timeframe:
minutes: 5
filter:
- query:
query_string:
query: 'app:mysql AND message:("Query_time" AND "Rows_examined")'
alert:
- "email"
email:
- "dba@company.com"
alert_subject: "[P2] 慢查询突增"
轻量级脚本监控示例(无集中平台)#
适用于小规模环境:使用 cron + shell 检查日志更新、文件大小、关键错误。
/usr/local/bin/mysql_log_check.sh
#!/usr/bin/env bash
LOG=/var/log/mysql/error.log
ALERT_TO="dba@company.com"
# 1) 检查日志是否更新(10分钟无更新)
if find "$LOG" -mmin +10 | grep -q "$LOG"; then
echo "[P2] error.log 10分钟未更新,可能日志采集中断或MySQL异常" \
| mail -s "MySQL日志更新异常" "$ALERT_TO"
fi
# 2) 检查错误关键字
if tail -n 200 "$LOG" | egrep -q "InnoDB corruption|too many connections|Disk is full"; then
echo "[P1] MySQL错误日志出现严重错误,请立即处理" \
| mail -s "MySQL严重错误" "$ALERT_TO"
fi
# 3) 检查日志大小异常(超过2GB)
SIZE=$(stat -c%s "$LOG")
if [ "$SIZE" -gt 2147483648 ]; then
echo "[P2] error.log 超过2GB,请检查是否日志异常增长或轮转失败" \
| mail -s "MySQL日志暴增" "$ALERT_TO"
fi
加入 crontab
*/5 * * * * /usr/local/bin/mysql_log_check.sh
命令与排错实践#
1) 检查日志更新与轮转#
# 查看日志最后更新时间
stat /var/log/mysql/error.log
# 查看日志轮转配置
cat /etc/logrotate.d/mysql-server
# 立即触发轮转测试
sudo logrotate -f /etc/logrotate.d/mysql-server
2) 快速定位关键错误#
# 最近200行错误日志
tail -n 200 /var/log/mysql/error.log
# 过滤高危关键字
egrep -n "InnoDB corruption|too many connections|Disk is full|Access denied" \
/var/log/mysql/error.log
3) 复制异常与binlog诊断#
# 查看复制状态
mysql -e "SHOW SLAVE STATUS\G"
# 检查binlog连续性
ls -lh /var/lib/mysql/mysql-bin.* | tail -n 5
常见问题与处理#
- 日志未更新:检查 MySQL 是否异常、日志路径配置是否改变、日志权限是否错误。
- 日志暴增:确认慢查询或错误异常持续触发;检查轮转配置是否生效。
- 告警噪声高:增加“连续N次触发”或比例阈值;设置维护窗口抑制。
练习#
1) 编写脚本检测 /var/log/mysql/slow.log 在 5 分钟内新增超过 200 行并告警。
2) 使用 ElastAlert 写一个规则:检测 Access denied 在 1 分钟内超过 20 次触发 P1。
3) 设计一条告警:磁盘使用率超过 85% 且日志大小增长速度超过 500MB/小时。