应将 limit_req_log_level 设为 notice 以降低 90% 以上限流日志量,隔离限流日志路径、启用 buffer/flush 缓冲与 logrotate 轮转,并排查 rewrite 死循环等日志炸弹源。

防止 Nginx 错误日志被高频写入撑爆磁盘,关键不是关日志,而是控级别、分路径、加缓冲、设轮转——尤其要揪出真正“刷盘大户”,比如限流拒绝日志。
精准降级限流日志级别
高频限流(如 limit_req)默认每拒绝一次就记一条 error 级日志,这是磁盘暴增的主因。应主动调低:
-
limit_req_log_level warn;:适合突发流量,保留可查痕迹,日志量下降约 60–70% -
limit_req_log_level notice;:推荐常态配额策略,仅表明“发生了限流”,不视为异常,降幅超 90% -
注意:
limit_conn本身不记日志,不存在limit_conn_log_level,别配错指令
隔离日志输出路径
即使降级,也要避免和真实故障日志混在一起,干扰排查:
- 为限流日志单独建文件:
error_log /var/log/nginx/limit_rej.log warn; - 连接拒绝日志也可独立:
error_log /var/log/nginx/conn_rej.log error; - 主
error.log就只留真正需要关注的错误,保持干净
启用缓冲与合理轮转
光改级别不够,还得优化写入方式:
- 加缓冲参数:
error_log /var/log/nginx/limit_rej.log warn buffer=64k flush=5s; - 用
logrotate配置高频轮转,例如:hourly+maxsize 10M,防止单文件过大阻塞写入 - 确保
postrotate中包含kill -USR1,让 Nginx 及时切换到新日志文件
堵住其他日志膨胀源头
除了限流,还要排查其他潜在“日志炸弹”:
- 检查
rewrite是否形成死循环——同一 IP 同一路径密集重复记录,状态码多为 301/500,立刻truncate -s 0 access.log并 reload 配置 - 关闭非必要日志:
access_log off;或access_log /dev/null;;错误日志级别至少设为warn - 避免
nodelay过度激进,保留burst缓冲,把部分硬拒绝转为排队延迟,天然减少日志触发频次











