除錯日誌

針對選定客戶端的除錯日誌
記錄到循環記憶體緩衝區

要啟用除錯日誌,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 層級也會停用除錯日誌。在下面的範例中,在 伺服器 層級上重新定義日誌會停用此伺服器的除錯日誌

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