nginx 不支持 error_log 指令按模块名过滤日志,但可通过启用 --with-debug 编译选项、在最小作用域(如 server 块)配置 debug 级别日志、结合 grep 关键词筛选及 if 条件控制,实现模块级调试日志聚焦。

不能直接用 error_log 指令“只记录特定模块”的错误信息——Nginx 原生不支持按模块名过滤日志。但可通过组合编译选项、作用域控制与日志上下文特征,实现**事实上的模块级调试日志聚焦**。
必须启用 debug 编译支持
模块级调试(如 ngx_http_proxy_module、ngx_http_lua_module)的日志只有在 Nginx 编译时加了 --with-debug 才会输出。否则即使配置 debug 级别,相关模块的内部 trace 也不会产生:
- 执行
nginx -V 2>&1 | grep -o with-debug,确认输出含with-debug - 若无,需重新编译;仅靠配置无法激活模块内部 debug 日志
在最小作用域启用 debug,并用路径/请求隔离
避免全局开 debug(日志量爆炸),而是将 error_log ... debug 放在最靠近目标模块行为的位置:
- 对代理类模块问题(如 upstream timeout、502):在对应
server或location块外层的server中设error_log /var/log/nginx/proxy-debug.log debug - 对 Lua 模块问题(如
lua_code_cache off引发的 reload 失败):在含lua_*指令的server块中单独声明error_log,且路径独立 - 注意:
location内不能写error_log,但可在其父server中配置,效果等同于限定该虚拟主机范围
用日志内容关键词快速筛选模块线索
debug 日志虽不按模块分文件,但每条记录自带上下文标识。启动后,用 grep 直接提取目标模块线索:
-
grep "proxy" /var/log/nginx/proxy-debug.log—— 查 proxy 模块连接、重试、header 处理 -
grep "lua" /var/log/nginx/proxy-debug.log—— 定位 Lua 初始化、指令执行、协程调度 -
grep -E "(ssl|handshake)" /var/log/nginx/debug.log—— 聚焦 SSL 模块握手失败或证书加载
临时加 IP 或 Header 条件,避免污染全量日志
生产环境调试时,可结合 if + 自定义 header 实现“仅对调试请求打 debug”:
- 在目标
server块中添加:if ($http_x_debug = "1") {<br> error_log /var/log/nginx/module-trace.log debug;<br>} - 发起请求时带上
curl -H "X-Debug: 1" https://example.com/api - 这样只有带标头的请求才会触发 debug 日志写入,且落盘到专用文件,不影响主日志流











