Nginx配置日誌

本節介紹如何在NGINX中配置日誌記錄錯誤和處理的請求。在本文章中將涉及以下內容 -

  1. 設置錯誤日誌
  2. 設置訪問日誌
  3. 啓用條件日誌記錄
  4. 日誌記錄到Syslog

1. 設置錯誤日誌

NGINX將遇到的不同嚴重性級別問題的信息寫入錯誤日誌。 error_log指令將日誌記錄設置爲特定文件,stderrsyslog,並指定要記錄的消息的最低級別。 默認情況下,錯誤日誌位於{NGING_INSTALL_PATH}/logs/error.log(絕對路徑取決於操作系統和安裝),並記錄來自所指定的所有嚴重級別的消息。

以下配置將錯誤消息的最小嚴重性級別更改爲從錯誤記錄到警告:

error_log logs/error.log warn;
## 或者可寫爲: error_log /var/logs/nginx/error.log warn;

在這種情況下,將記錄 warn, error crit, alertemerg 級別的消息。
錯誤日誌的默認設置全局工作。 要覆蓋它,將error_log指令放在 main (頂級)配置上下文中。main 上下文中的設置始終由其他配置級別繼承。 還可以在 http, stream, serverlocation 級別指定error_log指令,並覆蓋從較高級別繼承的設置。 如果發生錯誤,則該消息只寫入一個錯誤日誌,最接近發生錯誤的級別的錯誤日誌。 但是,如果在同一級別指定了多個error_log僞指令,則會將消息寫入所有指定的日誌。

注意:在開源NGINX版本1.5.2中添加了在同一配置級別指定多個error_log僞指令的功能。

2. 設置訪問日誌

在處理請求之後,NGINX在訪問日誌中寫入有關客戶端請求的信息。 默認情況下,訪問日誌位於{NGING_INSTALL_PATH}logs/access.log中,{NGING_INSTALL_PATH}爲安裝nginx的目錄,信息以預定義的組合格式寫入日誌。要覆蓋這個默認設置,請使用log_format指令更改記錄消息的格式,以及access_log指令,以指定日誌的位置及其格式。 日誌格式使用變量定義。

以下示例定義擴展預定義組合格式的日誌格式,其值指示響應gzip的壓縮比。 然後將格式應用於啓用壓縮的虛擬服務器。

http {
    log_format compression '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" "$gzip_ratio"';

    server {
        gzip on;
        access_log /spool/logs/nginx-access.log compression;
        ...
    }
}

以下是一些如何讀取生成時間值的規則:

  • 當通過多個服務器處理請求時,變量包含由逗號分隔的多個值。
  • 當從一個上游組到另一個上游組有內部重定向時,這些值以分號分隔。
  • 當請求無法到達上游服務器或無法接收到完整報頭時,變量包含「0」(零)。
  • 在連接到上游或從緩存中獲取回覆時出現內部錯誤的情況下,該變量包含「 - 」(連字符)。

可以通過啓用緩衝區的日誌消息和名稱包含變量的常用日誌文件的描述符緩存來優化日誌記錄。 要啓用緩衝,請使用access_log指令的緩衝區參數來指定緩衝區的大小。 當下一個日誌消息不適合緩衝區以及其他情況時,緩衝的消息將被寫入日誌文件。

要啓用日誌文件描述符的緩存,請使用open_log_file_cache指令。
error_log指令類似,在特定配置級別定義的access_log僞指令將覆蓋以前級別的設置。 當請求的處理完成時,消息將被寫入到當前級別上配置的日誌中,或者從先前的級別繼承。 如果一個級別定義了多個訪問日誌,則會將消息寫入所有的訪問日誌。

3. 啓用條件日誌記錄

條件記錄允許從訪問日誌中排除瑣碎或不重要的日誌條目。在NGINX中,條件日誌記錄由access_log僞指令的if參數啓用。

此示例不包括使用HTTP狀態代碼2xx(成功)和3xx(重定向)的請求:

map $status $loggable {
    ~^[23]  0;
    default 1;
}

access_log /path/to/access.log combined if=$loggable;

4. 日誌記錄到Syslog

syslog實用程序是計算機消息記錄的標準,並允許從單個syslog服務器上的不同設備收集日誌消息。 在NGINX中,對syslog的日誌記錄使用error_logaccess_log僞指令中的syslog:前綴進行配置。

Syslog消息可以發送到服務器=可以是域名,IP地址或UNIX域的套接字路徑。 可以使用端口指定域名或IP地址來覆蓋默認端口514. 可以在unix:prefix之後指定UNIX域套接字路徑:

error_log server=unix:/var/log/nginx.sock debug;
access_log syslog:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info;

在該示例中,NGINX錯誤日誌消息將在調試日誌記錄級別寫入UNIX域套接字,並將訪問日誌寫入具有IPv6地址和端口1234的syslog服務器。

facility =參數指定正在記錄消息的程序類型。 默認值爲local7。 其他可能的值是:authauthprivdaemoncronftplprkernmailnewssysloguseruucplocal0local7

tag =參數將自定義標籤應用於syslog消息(在我們的示例中爲nginx)。

severity =參數設置訪問日誌的syslog消息的嚴重性級別。 嚴重性越來越高的可能值爲:debuginfonoticewarnerror(default)critalertemerg。 消息記錄在指定的級別和更嚴重的級別。 在我們的示例中,嚴重性級別錯誤還使得可以 crit, alertemerg 級別。