nginx慢请求告警需通过access_log的$request_time字段提取超时请求,结合阈值与频次规则判定;用python流式解析日志,按ip/url聚合并滑动窗口统计,触发钉钉或企业微信告警,注意签名、代理与去重。

直接用日志内容触发告警,关键在“快捕获、准识别、稳送达”。Nginx 本身不生成标准 Slow Log,需通过 access_log 中的 $request_time 或 $upstream_response_time 字段提取响应超时请求,再结合阈值与频次规则判定是否告警。
从 access_log 提取慢请求
Nginx 配置中必须启用响应时间字段:
- 在
http或server块中定义日志格式,例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time'; - 确保
access_log使用该格式,并确认日志路径可被监控脚本读取(如/var/log/nginx/access.log) - 重启 Nginx 生效:
nginx -s reload
用 Python 实时解析并触发钉钉/微信告警
推荐使用 tail -F 流式读取 + 正则匹配,避免轮询和日志截断问题:
由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅、文字、图片、语音、视频消息回复文本、图文及音乐消息程序开发
- 匹配示例(响应时间 ≥2000ms):
pattern = r'(\d+\.\d+\.\d+\.\d+) .*?"(GET|POST) (.*?)" (\d{3}) .+? (\d+\.\d+) (\d+\.\d+)$'
其中第5组为$request_time(单位秒),转换为毫秒后判断是否超 2000 - 每条匹配记录记录 IP、URL、耗时、时间戳,缓存在内存字典中(按 IP 或 URL 聚合)
- 设定滑动窗口:例如 1 分钟内同一 IP 出现 ≥3 次 >2s 请求,即触发告警
- 告警内容包含可定位信息:
“[慢响应告警] 192.168.1.100 访问 /api/order 用时 2480ms(阈值2000ms),近60秒共触发4次”
钉钉机器人接入要点
微信需走企业微信自建应用或第三方网关,钉钉更轻量,但要注意生产约束:
- Webhook 地址中的
access_token必须保密,建议存入环境变量或配置文件(权限设为600) - 发送时添加
timestamp和sign(钉钉要求签名防篡改),Python 可用hmac+base64生成 - 内网服务器无法直连互联网?需部署正向代理(如 Nginx +
ngx_http_proxy_connect_module),将https://oapi.dingtalk.com映射为内网地址 - 避免高频发送:同一类慢请求告警 5 分钟内去重,或合并为“汇总消息”
微信告警替代方案(企业微信)
若必须用微信触达,企业微信是合规首选:
- 创建「自建应用」获取
corpid和corpsecret,调用接口获取access_token - 向指定用户/部门/标签推送文本消息,支持 Markdown 格式
- 相比钉钉,企业微信对消息频率和内容审核更严格,首次推送建议先测试免打扰时段
- 脚本中可封装统一告警函数,根据配置切换通道(
channel=dingtalk或wecom)










