将 error_log 级别设为 crit 可大幅减少日志落盘频次,释放磁盘 i/o、缩短高负载响应时间;它仅记录 worker 崩溃、端口绑定失败、ssl 加载异常等服务中断级故障,过滤 warn/error 等低危日志,并需分层配置、配套调优及指标验证。

直接把 error_log 级别设为 crit,能大幅减少日志落盘频次,从而释放磁盘 I/O、缩短高负载下请求响应时间。这不是“关日志”,而是精准保留真正影响服务可用性的致命错误,把 warn、error 等低危条目彻底过滤掉。
crit 级别只记录真正要命的问题
它不记 500、超时、客户端断连、重试失败这些常见但可恢复的问题,只捕获:
- worker 进程崩溃(段错误、OOM 被杀)
- 监听端口无法绑定(Address already in use / Permission denied)
- SSL 证书加载失败或密钥解析异常
- limit_req_zone 或 ssl_session_cache 共享内存初始化失败
- master 进程 fork worker 失败
这些事件极少发生,但一出就是服务中断级故障。其他日志全被跳过,自然不再触发高频 write() 系统调用。
必须分层配置,避免一刀切
全局 error_log 设 crit 是基础,但不能只写在 http 块里:
- 在
nginx.conf最外层(events上方)写:error_log /var/log/nginx/error.log crit; - 对支付、登录等核心业务
server块,额外加一行:error_log /var/log/nginx/pay-crit.log crit;,实现物理隔离 - 别在
location里重复定义,除非临时调试且明确知道后果
配套动作缺一不可
光调级别不够,得同步做三件事:
- 把
worker_processes设为auto,并检查worker_rlimit_nofile是否足够,防止资源耗尽却无日志提示 - 高并发场景下,禁用
daemon on;改用daemon off;+error_log stderr crit;(仅限容器环境),避免文件 I/O 争抢 - 用
iostat -dx 1观察 reload 或流量高峰时的w/s和%util:调成crit后,典型值应从 1500+ w/s 降至 30–80 w/s,%util从 >90% 回落到
验证是否真起效,看三个指标
上线后别只翻日志文件,重点确认:
-
ls -lh /var/log/nginx/error.log日均增长 ≤200KB(原来可能达几十 MB) -
grep "limit" /var/log/nginx/error.log | wc -l应为 0(限流、超时、rewrite loop 等都不再出现) -
time nginx -s reload耗时稳定在 80–120ms(原来可能卡在 400ms+,因刷盘阻塞)
本质上,crit 是一种“错误日志的硬过滤”,不是妥协,而是聚焦。它让磁盘 I/O 只服务于真正需要人工干预的故障,其余交给 metrics、trace 和 access log 承担可观测性职责。











