Nginx error_log可通过“日志输出→实时采集→错误识别→主动通知”链路实现严重错误告警;需正确配置error_log级别、用Filebeat或rsyslog实时采集error及以上级别日志、提取时间戳/级别/进程ID/请求线索等关键信息,并设置分级响应与抑制机制。

在 Nginx 中,error_log 本身不支持直接发送告警,但可以通过“日志输出 → 实时采集 → 错误识别 → 主动通知”这一链路实现严重错误的主动告警。核心在于把 error_log 的关键级别(如 error、crit、alert、emerg)从文件中可靠提取,并接入成熟的告警系统。
1. 正确配置 Nginx error_log 级别和输出目标
确保 Nginx 只记录真正需要告警的错误,避免噪音干扰:
- 在
nginx.conf的http、server或location块中,显式设置error_log路径和最低级别,例如:error_log /var/log/nginx/error.log error;
这样只会记录error及以上级别(error、crit、alert、emerg),跳过warn和notice。 - 避免多级重复配置:全局
error_log和子块都设了日志路径时,子块会覆盖父块,但级别取更严格的那个(即日志级别数字更小的)。建议统一在http块定义,子块仅按需覆盖路径或级别。 - 若使用 systemd 启动 Nginx,还需检查
/etc/systemd/system/multi-user.target.wants/nginx.service是否重定向了 stderr,否则emerg级别可能只打到 journal 而非文件——应禁用StandardError=journal或确保error_log显式指向文件。
2. 用日志采集工具实时捕获 error_log 中的高危事件
不推荐轮询或脚本 tail -f(易丢日志、难管理),推荐以下两种稳定方案:
-
Filebeat + Logstash/Elasticsearch:
Filebeat 监控/var/log/nginx/error.log,通过include_lines: ['error', 'crit', 'alert', 'emerg']过滤,再用 Logstash 的 grok 解析时间、级别、消息(如%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:level}\] .*?:(?<message>.+)$</message>),匹配后触发 webhook 发送至钉钉/企微/邮件服务。 -
rsyslog(轻量首选):
配置 rsyslog 将 Nginx error.log 按行读入,并基于正则匹配严重级别,转发到本地 socket 或远程 syslog 服务器:input(type="imfile" File="/var/log/nginx/error.log" Tag="nginx-error")<br> if $msg contains "emerg" or $msg contains "alert" or $msg contains "crit" then @127.0.0.1:514
再由接收端(如 Alertmanager 或自研脚本)解析并推送告警。
3. 告警内容需包含可定位的关键信息
单纯“Nginx 出现 error”意义不大。采集时务必保留原始日志中的上下文字段:
- 时间戳(ISO 格式,便于排序和关联)
-
错误级别(区分
crit和error的响应优先级) -
worker 进程 ID 或 upstream 地址(如
upstream timed out (110: Connection timed out) while connecting to upstream) -
请求相关线索(若日志中含
client: xxx、request: "GET /api/v1/xxx",应一并提取)
示例告警消息(钉钉 Markdown):
⚠️ Nginx CRIT 错误
⏰ 2024-06-15T14:22:03+08:00
? server: api.example.com, upstream: 10.0.1.5:8000
❌ upstream prematurely closed connection while reading response header from upstream
? client: 203.208.60.1, request: "POST /v1/submit"
4. 设置告警抑制与分级响应机制
防止同一故障刷屏或漏掉真正紧急的问题:
- 对
emerg和alert级别启用“立即电话呼叫”;crit级别发企业微信+短信;error级别仅推送到值班群并静默 5 分钟去重。 - 用 Prometheus + nginx-vts-exporter 或 nginx-lua-prometheus 收集
ngx_http_upstream_module的失败计数,当upstream_fails_total{upstream="backend"} > 10持续 2 分钟,触发二级告警——比单条 error_log 更反映真实服务异常。 - 在采集端(如 Filebeat)加条件过滤,排除已知偶发错误,例如:
exclude_lines: ['.*gracefully shutting down.*', '.*signal.*']
整个链路不依赖 Nginx 自身扩展,稳定性和可观测性更好。关键是让日志“出得准、抓得全、判得清、通得快”。


















