调试日志

选定客户端的调试日志
记录到循环内存缓冲区

要启用调试日志,需要在构建过程中配置 Nginx 以支持调试

./configure --with-debug ...

然后,应使用 error_log 指令设置 debug 级别

error_log /path/to/log debug;

要验证 Nginx 是否已配置为支持调试,请运行 nginx -V 命令

configure arguments: --with-debug ...

预构建的 Linux 软件包提供开箱即用的调试日志支持,使用 nginx-debug 二进制文件(1.9.8),可以通过以下命令运行

service nginx stop
service nginx-debug start

然后设置 debug 级别。Windows 版本的 Nginx 二进制文件始终使用调试日志支持构建,因此只需设置 debug 级别即可。

请注意,重新定义日志而不指定 debug 级别将禁用调试日志。在下面的示例中,在 server 级别重新定义日志会禁用此服务器的调试日志

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;
        ...

选定客户端的调试日志

还可以仅对 选定的客户端地址 启用调试日志

error_log /path/to/log;

events {
    debug_connection 192.168.1.1;
    debug_connection 192.168.10.0/24;
}

记录到循环内存缓冲区

调试日志可以写入循环内存缓冲区

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

或者使用以下 lldb 脚本

expr ngx_log_t *$log = ngx_cycle->log
expr while ($log->writer != ngx_log_memory_writer) { $log = $log->next; }
expr ngx_log_memory_buf_t *$buf = (ngx_log_memory_buf_t *) $log->wdata
memory read --force --outfile debug_log.txt --binary $buf->start $buf->end