启用 limit_req_log_level 可自定义限流日志级别,默认 error 级易掩盖真实错误;需与 limit_req 同级配置,仅影响被拒绝或延迟请求的日志,支持 info 至 error 级别,配合 $limit 变量可增强 access log 分析能力。

当 Nginx 启用 limit_req 限流后,超出速率限制的请求默认只记录到 error log 中,且级别为 error。这容易掩盖真实错误,也难以做精细化日志分析。通过 limit_req_log_level 指令,可以单独控制限流触发时的日志级别,让日志更清晰、更可控。
限流日志级别可独立设置
limit_req_log_level 必须与 limit_req 配合使用,作用于同一上下文(如 location 或 server 块)。它不改变正常请求或其它错误的日志行为,只影响因触发限流规则而被拒绝(返回 503)或延迟处理的请求所生成的日志条目。
- 支持的日志级别包括:
info、notice、warn、error(默认值) - 级别越低(如
info),日志越“安静”;级别越高(如error),越容易被监控系统捕获,但也可能干扰故障排查 - 若未显式配置,Nginx 使用
error级别记录限流事件
典型配置示例
以下配置定义每秒最多 10 个请求,突发容量 20,超限时以 warn 级别记录:
http {
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
<pre class="brush:php;toolbar:false;">server {
location /api/ {
limit_req zone=perip burst=20 nodelay;
limit_req_log_level warn;
proxy_pass http://backend;
}
}}
此时,被拒绝的请求会在 error log 中输出类似:
[warn] 12345#0: *667 limiting requests, excess: 25.000 by zone "perip", client: 192.168.1.100, ...
配合日志格式区分限流事件
仅靠日志级别还不够直观。建议在自定义 access log 中加入变量 $limit(Nginx 1.13.10+ 支持),它在限流触发时返回对应 zone 名,否则为空:
- 定义日志格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$limit"'; - 在 location 中启用:
access_log /var/log/nginx/api_access.log main; - 这样可在 access log 中直接看到哪些请求命中了限流(如
"perip"),便于统计和告警
调试与验证要点
启用 limit_req_log_level 后,需确认实际效果:
- 检查 Nginx 版本是否 ≥ 1.7.6(该指令首次引入)
- 确保
error_log配置的全局日志级别 ≤ 所设limit_req_log_level(例如设为warn,但error_log ... info就能记录;若设为info而全局是warn,则不会输出) - 用
ab或wrk快速压测触发限流,观察 error log 是否按预期级别出现日志











