Nginx error_log共8级,从低到高为debug、info、notice、warn、error、crit、alert、emerg;级别越低记录越详细,越高仅记崩溃事件,且为“包含式”过滤,即设warn会同时记录warn及以上所有级别日志。

Nginx 的 error_log 共有 8 个日志级别,从低到高依次为:debug、info、notice、warn、error、crit、alert、emerg。级别越低,记录越详细(比如 debug 会输出变量值、配置加载步骤、信号处理过程);级别越高,只记录崩溃级事件(如端口绑定失败、主进程退出、内存分配失败)。注意:日志是“包含式”过滤——设为 warn,就会记录 warn 及更严重(error/crit/alert/emerg)的日志;设为 error,则跳过 debug/info/notice 等全部低级别信息。
按作用域分层设置,避免全局污染
Nginx 支持在 main(全局)、http、server、location 四个作用域配置 error_log,优先级由近及远:某个 server 块里写了,就只管这个虚拟主机;没写才继承上层 http 配置;都没写才用 main 块默认值。常见错误是改了全局却无效,其实是被某处 server 块里的独立配置覆盖了。
-
main 块(nginx.conf 最外层)只设
error:专用于记录 master 进程异常(如端口占用、fork 失败、模块加载崩溃),日志量极小,IO 几乎无感 -
http 块内不设
error_log</strong></li> <li><strong>关键业务的 <code>server
块设warn:能捕获证书过期、upstream refused connection、rewrite loop、client sent too large body 等高频可恢复但需人工介入的问题,日增日志通常 ≤50MB -
非核心接口(如静态资源、健康检查路径)的
location内可设crit或更高,甚至关闭日志:例如error_log /dev/null crit;,避免 404、favicon.ico 找不到等冗余记录冲淡重点
debug 不是常备药,而是手术刀
debug 级别不能常态开启,必须满足两个硬条件才生效:
- Nginx 编译时含
--with-debug(执行nginx -V 2>&1 | grep -o with-debug验证) - 配置中显式写成
error_log /path/to/debug.log debug;,且路径对 worker 进程可写
临时调试推荐精准打点:
- 在具体
location块内加独立配置,仅该路径生效:error_log /var/log/nginx/debug_api.log debug; - 搭配
if限制范围(仅限location内):if ($http_x_debug = "1") { error_log /var/log/nginx/debug_trace.log debug; } - debug 日志必须写入独立磁盘分区(如
/mnt/ssd/),并启用logrotate的copytruncate模式,防止重命名阻塞写入
联动系统指标验证是否合理
单看配置没意义,得结合实时系统反馈判断是否过载:
- 运行
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配置


















