调试日志

Debugging log for selected clients
Logging to a cyclic memory buffer

要启用调试日志,需要将 nginx 配置为在构建期间支持调试:

./configure --with-debug ...

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

error_log /path/to/log debug;

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

configure arguments: --with-debug ...

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

service nginx stop
service nginx-debug start

然后设置debug级别。Windows 的 nginx 二进制版本始终构建有调试日志支持,因此只需设置级别debug就足够了。

请注意,重新定义日志而不指定级别 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;
        ...

选定客户端的调试日志

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

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