nginx 要启用调试日志,需要在预编译源码的时候使用 configure 配置 nginx 以支持构建期间的 debug。命令如下:
./configure --with-debug
然后就可以在 nginx.conf 配置文件中使用 error_log 指令设置 debug 级别,配置如下:
error_log /path/to/log debug;
要验证 nginx 是否配置为支持调试,请运行 nginx -V 命令,然后查看 configure arguments 中是否存在 --with-debug 配置,如下:
hxstrive@ubuntu:~/Desktop$ nginx -V nginx version: nginx/1.20.1 built by gcc 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) built with OpenSSL 1.1.1f 31 Mar 2020 TLS SNI support enabled configure arguments: --with-debug ...
预构建的 Linux 包为使用 nginx-debug 二进制文件调试日志提供开箱即用的支持,该二进制文件可以使用命令运行。命令如下:
# 普通版本 service nginx stop # 开启 debug 调试的版本 service nginx-debug start
然后设置 debug 级别。 Windows 的 nginx 二进制版本总是使用 debug 日志构建,因此只需设置调试级别就足够了。
注意:在不指定 debug 级别的情况下重新定义日志将禁用 debug 日志。在下面的示例中,在 server 级别重新定义日志会禁用此 server 的 debug 日志:
error_log /path/to/log debug; http { server { error_log /path/to/log; #... } }
为了避免这种情况,应该注释掉重新定义日志的行,或者还应该添加 debug 级别规范:
error_log /path/to/log debug; http { server { error_log /path/to/log debug; #... } }
nginx 中也可以只为选定的客户端地址启用 debug 日志,配置如下:
error_log /path/to/log; events { debug_connection 192.168.1.1; debug_connection 192.168.10.0/24; }
调试日志可以写入循环内存缓冲区,我们可以将循环内存缓冲区想象为一个表格,该表格只允许保存n条数据,依次从0开始存储,直到n-1条数据。此时,如果还有日志需要保存,则继续从0开始进行保存。
配置循环内存缓冲区如下:
error_log memory:32m debug;
即使在高负载下,将 debug 级别日志记录到循环内存缓冲区也不会对性能产生重大影响。在这种情况下,可以使用如下所示的 gdb 脚本提取日志:
set $log = ngx_cycle->log while $log->writer != ngx_log_memory_writer set $log = $log->next end set $buf = (ngx_log_memory_buf_t *) $log->wdata dump binary memory debug_log.txt $buf->start $buf->end