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/小时。