ngx_http_log_module 模組

範例設定
指令
     access_log
     log_format
     open_log_file_cache

ngx_http_log_module 模組會以指定的格式寫入請求日誌。

請求會在處理結束的位置的內容中記錄。如果請求處理期間發生內部重定向,則可能與原始位置不同。

範例設定

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

access_log /spool/logs/nginx-access.log compression buffer=32k;

指令

語法 access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
預設
access_log logs/access.log combined;
上下文 http, server, location, if in location, limit_except

設定緩衝日誌寫入的路徑、格式和設定。可以在相同的設定層級上指定多個日誌。可以透過在第一個參數中指定 “syslog:” 前綴來設定記錄到 syslog。特殊值 off 會取消目前層級的所有 access_log 指令。如果未指定格式,則會使用預先定義的 “combined” 格式。

如果使用 buffergzip (1.3.10, 1.2.7) 參數,則會緩衝寫入日誌。

緩衝區大小不得超過原子寫入磁碟檔案的大小。對於 FreeBSD,此大小不受限制。

啟用緩衝時,資料將會寫入檔案

如果使用 gzip 參數,則緩衝資料會在寫入檔案之前壓縮。壓縮等級可以在 1 (最快,較少壓縮) 和 9 (最慢,最佳壓縮) 之間設定。預設情況下,緩衝區大小等於 64K 位元組,而壓縮等級設定為 1。由於資料是以原子區塊壓縮的,因此可以隨時透過 “zcat” 解壓縮或讀取日誌檔案。

範例

access_log /path/to/log.gz combined gzip flush=5m;

為了使 gzip 壓縮起作用,nginx 必須使用 zlib 程式庫建置。

檔案路徑可以包含變數 (0.7.6 以上),但此類日誌有一些限制

if 參數 (1.7.0) 啟用條件記錄。如果 condition 的值評估為 “0” 或空字串,則不會記錄請求。在以下範例中,回應代碼為 2xx 和 3xx 的請求將不會被記錄

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

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

語法 log_format name [escape=default|json|none] string ...;
預設
log_format combined "...";
上下文 http

指定日誌格式。

escape 參數 (1.11.8) 允許在變數中設定 jsondefault 字元逸出,預設情況下,使用 default 逸出。none 值 (1.13.10) 會停用逸出。

對於 default 逸出,字元 “"”、“\” 和其他值小於 32 (0.7.0) 或大於 126 (1.1.6) 的字元會逸出為 “\xXX”。如果找不到變數值,則會記錄連字號 (“-”)。

對於 json 逸出,所有 JSON 字串中不允許的字元都會逸出:字元 “"” 和 “\” 會逸出為 “\"” 和 “\\”,值小於 32 的字元會逸出為 “\n”、“\r”、“\t”、“\b”、“\f” 或 “\u00XX”。

日誌格式可以包含通用變數和僅在寫入日誌時存在的變數

$bytes_sent
傳送到用戶端的位元組數
$connection
連線序號
$connection_requests
透過連線發出的目前請求數 (1.1.18)
$msec
在寫入日誌時以毫秒解析度的秒數
$pipe
如果請求是管線化,則為 “p”,否則為 “.
$request_length
請求長度 (包括請求行、標頭和請求主體)
$request_time
以毫秒解析度的秒為單位的請求處理時間;從用戶端讀取第一個位元組到將最後一個位元組傳送到用戶端後的日誌寫入之間經過的時間
$status
回應狀態
$time_iso8601
ISO 8601 標準格式的當地時間
$time_local
通用日誌格式的當地時間

在現代 nginx 版本中,變數 $status (1.3.2, 1.2.2)、$bytes_sent (1.3.8, 1.2.5)、$connection (1.3.8, 1.2.5)、$connection_requests (1.3.8, 1.2.5)、$msec (1.3.9, 1.2.6)、$request_time (1.3.9, 1.2.6)、$pipe (1.3.12, 1.2.7)、$request_length (1.3.12, 1.2.7)、$time_iso8601 (1.3.12, 1.2.7) 和 $time_local (1.3.12, 1.2.7) 也可用作通用變數。

傳送到用戶端的標頭行具有前綴 “sent_http_”,例如,$sent_http_content_range

設定始終包含預先定義的 “combined” 格式

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

語法 open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
預設
open_log_file_cache off;
上下文 http, server, location

定義一個快取,用於儲存名稱包含變數的常用日誌的檔案描述符。該指令具有以下參數

max
設定快取中的描述符最大數量;如果快取已滿,則會關閉最近最少使用的 (LRU) 描述符
inactive
設定如果在該時間內沒有存取,則快取描述符關閉的時間;預設情況下,為 10 秒
min_uses
設定在 inactive 參數定義的時間內,檔案的最少使用次數,以讓描述符保持在快取中開啟;預設情況下,為 1
valid
設定應檢查檔案是否仍然存在且具有相同名稱的時間;預設情況下,為 60 秒
off
停用快取

使用範例

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;