选对 error_log 级别关键在于故障时精准说话而非信息冗余:全局设 error 覆盖停服级问题,http 作用域按业务重要性设 warn 或 error,debug 仅临时启用且须满足 --with-debug 编译及路径隔离,同时联动 iostat、df 等监控验证 io 影响。

选对 error_log 级别,不是为了“看得更全”,而是让日志在故障发生时精准说话——既不被海量噪音淹没,也不漏掉关键线索。生产环境里,级别选错,轻则磁盘写满、IO 告警,重则掩盖真实错误、拖慢响应、甚至触发服务降级。
全局设 error,守住底线不越界
主配置块(nginx.conf 最外层)的 error_log 只管 Nginx 自身:配置解析失败、端口被占、worker fork 异常、模块加载崩溃。这类问题极少发生,但一出就是停服级。长期设为 error 级足够覆盖,且日志量极小、IO 几乎无感。切忌在此处设 debug 或 info,否则每次 reload 都会刷出数百行生命周期日志,干扰判断又白耗资源。
HTTP 作用域按业务重要性分级
真正影响请求链路的错误(502/504、upstream refused、rewrite loop、client closed)都发生在 http/server/location 块内。这里要差异化设置:
- 核心业务
server块建议设 warn:能捕获证书过期、连接拒绝、临时缓冲告警等高价值预警,日增日志通常 ≤50MB,IO 可控 - 静态资源或非关键接口的
location可设 error 或关闭日志:避免 404、favicon.ico 找不到等冗余记录冲淡重点 - 绝对不要在
http块顶层统一设debug:它会让每个请求都打 rewrite、proxy、SSL 握手细节,IO 压力陡增数倍,且信息高度重复
debug 是手术刀,不是常备药
debug 级别不能常态开启,必须满足两个硬条件:
- Nginx 编译时含
--with-debug(用nginx -V | grep with-debug验证) - 显式指定路径并写明
debug,如error_log /mnt/ssd/debug.log debug
启用后务必配合过滤使用,例如:grep -E "(conf|signal|cycle|upstream)" /mnt/ssd/debug.log
输出到独立 SSD 分区,避免填满系统盘;容器环境更推荐对接 syslog,由 journald 统一收敛。
必须联动系统指标验证效果
单看日志级别没意义,得结合实时系统反馈判断是否过载:
- 用
iostat -x 1观察%util和await:若升为warn后%util持续 >85%,说明日志写入已成瓶颈,需回退或拆分路径 - 用
df -h /var/log和ls -lh /var/log/nginx/监控增长:warn 级下日增超 50MB 就该收缩范围(如仅保留 3 个关键 server 块)或启用logrotate的copytruncate模式 - 检查
nginx -t耗时变化:若校验明显变慢,可能是 debug 日志干扰了 fork 性能,需排查是否误启全局 debug











