crit级别能大幅降低高并发下的磁盘IO压力,因其仅记录worker崩溃、端口占用、共享内存初始化失败等危及服务可用性的致命事件,过滤掉limit_conn拒绝、客户端断连、上游超时等高频非致命error/warn日志。

直接将 error_log 设为 crit 级别,能大幅减少高并发连接场景下的磁盘写入压力——它不是关日志,而是让只有“危及服务可用性”的事件才落盘,跳过 warn、error 等大量非致命但高频的日志刷写。
为什么 crit 级别对连接类 IO 压力最有效
在连接密集型场景(如 API 网关、负载均衡器),以下事件极易高频触发并默认记为 error 或 warn:
- limit_conn 触发的连接拒绝(默认 error)
- 客户端主动断连(client closed connection)
- upstream 连接超时或重试失败
- SSL 握手异常(尤其 TLS 扫描或旧客户端)
这些事件本身不中断服务,却每秒生成数十至数百条日志。设为 crit 后,它们全部被过滤,仅保留真正需立即响应的问题,例如:
- worker 进程崩溃(
segmentation fault) - 共享内存 zone 初始化失败(影响 limit_conn/limit_req 生效)
- 监听端口无法绑定、配置重载失败
必须配合的三项关键配置
单独改 error_log ... crit 不够,需同步落实:
-
全局 error_log 显式设为 crit:放在
http或main块顶层,避免被子块覆盖;例如:error_log /var/log/nginx/error.log crit; -
关闭非必要错误记录:添加
log_not_found off;和log_subrequest off;,防止 favicon、健康检查等探测请求产生冗余 error 日志 -
将限流日志分流隔离:即使主日志设为 crit,仍建议为限流行为单独记录,例如:
error_log /var/log/nginx/limit.log notice;<br>limit_conn_log_level notice;<br>limit_req_log_level notice;
这样既保可观测性,又不污染主错误通道
验证是否真正生效
上线后不能只看日志文件是否变小,要确认三件事:
- 用
wrk -t4 -c200 -d5s http://your-api/模拟压测,观察/var/log/nginx/error.log是否几乎无新增(除启动日志外) - 执行
iostat -dx 1,对比前后w/s(写入次数)是否下降 40% 以上,%util是否明显回落 - 检查
limit.log中是否仍有合理频次的限流记录,确保监控和审计能力未丢失
不复杂但容易忽略:crit 是“筛选器”,不是“静音键”。它把磁盘 IO 资源留给真正该响的警报。

















