天天看點

《深入剖析Nginx》——2.2 利用日志資訊跟蹤Nginx

本節書摘來自異步社群《深入剖析nginx》一書中的第2章,第2.2節,作者: 高群凱 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

優秀的程式都會帶有自己的日志輸出接口,并且一般還會給出不同等級的輸出級别,以便于重次資訊的過濾,比如 linux 核心的日志輸出标準接口為 printk,并且給出了kern_emerg、kern_alert、kern_debug等這樣的輸出等級。nginx 與此類似,下面具體來看。

為了擷取最豐富的日志資訊,我們在進行configure配置時,需要把--with-debug選項加上,這樣能生成一個名為ngx_debug的宏,而在nginx源碼内,該宏被用作控制開關,如果沒有它,那麼很多日志邏輯代碼将在make編譯時直接跳過。比如對單連接配接的debug_connection調試指令、分子產品日志調試debug_http功能等。

有了上面這個編譯前提條件之後,我們還需在配置檔案裡做恰當的設定。關于這點,nginx提供的主要配置指令為error_log。該配置項的預設情況(預設值定義在objs/ngx_auto_config.h檔案内)為

表示日志資訊記錄在logs/error.log(如果沒改變nginx的預設工作路徑的話,那麼其父目錄為/usr/local/nginx/)檔案内,而日志記錄級别為error。

在實際進行配置時,可以修改日志資訊記錄檔案路徑(比如修改為/dev/null,此時所有日志資訊将被輸出到所謂的linux黑洞裝置,導緻日志資訊全部丢棄)或直接輸出到标準終端(此時指定為stderr)。nginx提供的日志記錄級别一共有八級,等級從低到高分别為debug、info、notice、warn、error、crit、alert、emerg。如果設定為error,則表示nginx内等級為error、crit、alert和emerg的四種級别的日志将被輸出到日志檔案或标準終端。另外的debug、info、notice和warn這四種日志将被直接過濾掉而不會輸出。是以如果我們隻關注特别嚴重的資訊,隻需将日志等級設定為error即可大大減少nginx的日志輸出量,這樣就避免了在大量的日志資訊裡尋找重要資訊的麻煩。

當我們利用日志跟蹤nginx時,需要擷取最大量的日志資訊,是以此時可以把日志等級設定為最低的debug級。在這種情況下,如果覺得調試日志太多,nginx提供按子產品控制的更細粒等級:debug_core、debug_alloc、debug_mutex、debug_event、debug_http、debug_imap。比如如果隻想看http的調試日志,則需做如下設定。

此時nginx将輸出從info到emerg所有等級的日志資訊,而debug日志則将隻輸出與http子產品相關的内容。

error_log配置指令可以放在配置檔案的多個上下文内,比如main、http、server、location,但同一個上下文中隻能設定一個error_log,否則nginx将提示類似如下這樣的錯誤。

但在不同的配置檔案上下文裡可以設定各自的error_log配置指令,通過設定不同的日志檔案,這是nginx提供的又一種資訊切割過濾手段。

nginx提供的另一種更有針對性的日志調試資訊記錄是針對特定連接配接的,這通過debug_connection配置指令來設定,比如如下設定調試日志僅針對ip位址192.168.1.1和ip段192.168.10.0/24:

nginx的日志功能仍在不斷改進中,如能利用得好,對于我們跟蹤nginx還是非常有幫助的,至少我知道有不少朋友十分習慣于使用c庫的printf()函數列印調試,相比之下,nginx提供的ngx_log_xxx()系列函數要強大得多。

繼續閱讀