调试日志
| 针对特定客户端的调试日志 记录到循环内存缓冲区 |
要启用调试日志,需要在编译 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