用tail -f与grep实时捕获nginx error_log新增错误行,过滤error/crit/alert/emerg及502/503/504等关键词,结合while循环去重和邮件/企微/本地日志告警,可快速落地轻量监控。

用自动化脚本监控 Nginx 的 error_log 并实现告警,核心是“实时捕获新增错误行 + 过滤关键错误 + 触发通知”。不依赖复杂平台也能快速落地。
确认 error_log 配置和日志路径
先确保 Nginx 日志按需输出且可被脚本稳定读取:
-
检查 nginx.conf 中的 error_log 指令:例如
error_log /var/log/nginx/error.log warn;,注意路径和级别(warn及以上会记录连接拒绝、上游超时、权限失败等典型问题) -
避免日志轮转干扰:如果用了 logrotate,确认配置中含
copytruncate或使用create+dateext,并让脚本监听主日志文件(如error.log),而非带日期后缀的归档文件 -
验证日志可读性:运行
tail -f /var/log/nginx/error.log看能否实时看到新错误(如手动触发 502 错误),确认权限无阻塞
用 tail -f + grep 实现实时错误捕获
轻量级方案:用 shell 脚本持续监听新增日志行,匹配关键词后触发告警:
- 基础命令组合:
tail -F /var/log/nginx/error.log | grep --line-buffered -E "(error|crit|alert|emerg|502|503|504|connect() failed|no live upstream|upstream timed out)" -
-F支持文件重创建(如 logrotate 后);--line-buffered强制逐行输出,避免 grep 缓存导致延迟 - 常见有效关键词:
connect() failed(上游连不上)、upstream timed out(后端响应慢)、no live upstream(所有后端宕机)、Permission denied(SSL证书或proxy_temp目录权限问题)
封装为守护脚本并集成告警通道
把监听逻辑写成后台脚本,加入简单去重和通知能力:
- 用
while read循环处理每条匹配日志,记录最近 5 分钟内相同错误的出现次数,避免同一问题高频刷屏 - 告警方式选最易接入的:
• 发邮件:调用mail -s "Nginx Error Alert" admin@example.com <br> • 推送企业微信/钉钉:用 curl POST JSON 到 Webhook 地址,含时间、错误摘要、日志片段<br> • 写入本地告警文件供其他系统采集:echo "$(date): $line" >> /var/log/nginx/alert.log - 用
nohup ./nginx_error_watch.sh &启动,或通过 systemd 管理生命周期(推荐)
进阶建议:用更稳定的工具替代纯 shell
生产环境建议切换到成熟日志监控工具,降低维护成本:
- logrotate + inotifywait:监听日志文件变更事件,比 tail -f 更省资源,适合低频错误场景
- filebeat + Elasticsearch + Kibana:集中收集多台 Nginx 日志,用 KQL 做错误聚合与阈值告警(如“5 分钟内 502 错误 > 10 次”)
- prometheus + nginx-vts-exporter:若已用 Prometheus,可配合 exporter 暴露错误计数指标,用 Alertmanager 做基于指标的告警(需 Nginx 编译含 vts 模块)











