最稳妥的做法是用 rsyslog 实时监听关键错误并触发轻量告警脚本发邮件:一、启用 imfile 模块精准匹配错误关键词后 stop 防重;二、脚本从 stdin 读日志,用 mail 发送含主机名、时间及摘要的邮件;三、按致命/警告/忽略三级分类处理;四、验证时模拟日志、重启服务、检查绝对路径与邮件投递。

Linux 日志出现严重错误时自动发邮件,关键不是“等日志写完再扫描”,而是让系统在错误发生的瞬间就捕获并通知。最稳妥的做法是用 Rsyslog 做实时监听 + 脚本触发邮件,不依赖定时轮询,延迟低、资源省、可靠性高。
一、用 Rsyslog 实时监听关键错误
Rsyslog 本身就能过滤日志内容并执行动作,无需额外装监控工具。重点是精准匹配、避免误报:
- 启用 imfile 模块,在 /etc/rsyslog.d/ 下新建配置文件(如 20-error-alert.conf)
- 指定要监控的日志路径,比如 /var/log/nginx/error.log 或 /var/log/messages
- 用 if $msg contains 或正则 re_match 匹配真实错误关键词,例如:'Connection refused'、'segmentation fault'、'Out of memory'
- 匹配后加 stop 防止重复触发;用 template 控制传给脚本的内容格式
二、写一个轻量告警脚本
脚本从标准输入接收 Rsyslog 传来的匹配行,直接调用 mail 发送,不依赖复杂框架:
- 保存为 /usr/local/bin/send-log-alert.sh,赋予可执行权限:chmod +x
- 开头加 #!/bin/bash,用 ALERT_MSG=$(cat) 获取原始日志片段
- 组装邮件主题带主机名和时间,正文包含错误摘要(截取前 200 字符即可)和完整日志行
- 确保系统已配置好 SMTP(如 QQ 邮箱需设 smtps://smtp.qq.com:465 和授权码)
三、区分错误等级,避免告警疲劳
不是所有错误都值得立刻发邮件,得按影响分级处理:
- 致命级(如 OOM、core dump、数据库连接中断):立即发,标题加【紧急】,收件人设为管理员+运维群邮箱
- 警告级(如 timeout、retry limit exceeded):可聚合,每小时汇总一次,避免刷屏
- 忽略级(如已知的调试日志、测试环境临时错误):在 Rsyslog 规则里用 !if 排除
四、验证与上线前检查
别跳过这步——很多告警失效是因为环境没对齐:
- 手动模拟一条错误日志:echo 'Jul 29 11:00:00 server kernel: Out of memory' >> /var/log/messages
- 重启 Rsyslog:sudo systemctl restart rsyslog,看脚本是否被调用(可用 logger "test" 辅助调试)
- 确认脚本里用的是绝对路径的 mail(如 /usr/bin/mail),cron 或 Rsyslog 不继承用户 PATH
- 检查邮件是否进垃圾箱——部分云邮箱会因缺少 SPF/DKIM 拦截,初期建议用企业微信 Webhook 交叉验证











