Nginx的log日誌配置
Nginx日誌對於統計、系統服務排錯很有用。Nginx日誌主要分為兩種:access_log(訪問日誌)和error_log(錯誤日誌)。通過訪問日誌我們可以得到使用者的IP地址、瀏覽器的資訊,請求的處理時間等資訊。錯誤日誌記錄了訪問出錯的資訊,可以幫助我們定位錯誤的原因。本文將詳細描述一下如何配置Nginx日誌。
設定access_log
訪問日誌主要記錄客戶端的請求。客戶端向Nginx伺服器發起的每一次請求都記錄在這裡。客戶端IP,瀏覽器資訊,referer,請求處理時間,請求URL等都可以在訪問日誌中得到。當然具體要記錄哪些資訊,你可以通過log_format指令定義。
access_log設定語法
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
#設定訪問日誌
access_log off;
#關閉訪問日誌
path format buffer gzip flush if
另外,還有一個特殊的值off。如果指定了該值,當前作用域下的所有的請求日誌都被關閉。
作用域
可以應用 access_log
指令的作用域分別有 http
, server
, location
, limit_except
。也就是說,在這幾個作用域外使用該指令, Nginx
會報錯。
以上是 access_log
指令的基本語法和引數的含義。下面我們看一幾個例子加深一下理解。
基本用法
access_log /var/logs/nginx-access.log
該例子指定日誌的寫入路徑為 /var/logs/nginx-access.log
,日誌格式使用預設的 combined
。
access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m
該例子指定日誌的寫入路徑為 /var/logs/nginx-access.log
,日誌格式使用預設的 combined
,指定日誌的快取大小為32k,日誌寫入前啟用 gzip
進行壓縮,壓縮比使用預設值1,快取資料有效時間為1分鐘。
使用 log_format
自定義日誌格式
Nginx預定義了名為 combined
日誌格式,如果沒有明確指定日誌格式預設使用該格式:
log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
如果不想使用Nginx預定義的格式,可以通過 log_format
指令來自定義。
下面是 log_format
指令中常用的一些變數:
變數 | 含義 |
---|---|
$bytes_sent | 傳送給客戶端的總位元組數 |
$body_bytes_sent | 傳送給客戶端的位元組數,不包括響應頭的大小 |
$connection | 連線序列號 |
$connection_requests | 當前通過連線發出的請求數量 |
$msec | 日誌寫入時間,單位為秒,精度是毫秒 |
$pipe | 如果請求是通過http流水線傳送,則其值為"p",否則為“." |
$request_length | 請求長度(包括請求行,請求頭和請求體) |
$request_time | 請求處理時長,單位為秒,精度為毫秒,從讀入客戶端的第一個位元組開始,直到把最後一個字元傳送張客戶端進行日誌寫入為止 |
$status | 響應狀態碼 |
$time_iso8601 | 標準格式的本地時間,形如“2017-05-24T18:31:27+08:00” |
$time_local | 通用日誌格式下的本地時間,如"24/May/2017:18:31:27 +0800" |
$http_referer | 請求的referer地址。 |
$http_user_agent | 客戶端瀏覽器資訊。 |
$remote_addr | 客戶端IP |
$http_x_forwarded_for | 當前端有代理伺服器時,設定web節點記錄客戶端地址的配置,此引數生效的前提是代理伺服器也要進行相關的x_forwarded_for設定。 |
$request | 完整的原始請求行,如 "GET / HTTP/1.1" |
$remote_user | 客戶端使用者名稱稱,針對啟用了使用者認證的請求 |
$request_uri | 完整的請求地址,如 "https://www.imydl.com" |
$brotli_ratio | Brotli壓縮演算法模組壓縮比 |
在access_log和log_format中使用了很多變數,這些變數沒有一一列舉出來,詳細的變數資訊可以參考『 Nginx官方文件 』
下面演示一下自定義日誌格式的使用:
access_log /var/logs/nginx-access.log main;
log_formatmain'$clientRealIP - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '[$brotli_ratio] ' '"$http_user_agent"';
我們使用 log_format
指令定義了一個 main
的格式,並在 access_log
指令中引用了它。假如客戶端有發起請求: https://www.imydl.com ,我們看一下我擷取的一個請求的日誌記錄:
203.208.60.116 - - [02/Feb/2019:01:21:55 +0800] "GET /sszp/6553.html HTTP/1.1" 200 21746 "-" [5.20] "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
我們看到最終的日誌記錄中 $brotli_ratio
對應了一個 [4.95]
,這就說明被Brotli模組壓縮了,壓縮比達到了4.95。
設定日誌檔案描述符的快取
open_log_file_cache
每一條日誌記錄的寫入都是先開啟檔案再寫入記錄,然後關閉日誌檔案。如果你的日誌檔案路徑中使用了變數,如 access_log /var/logs/$host/nginx-access.log
,為提高效能,可以使用 open_log_file_cache
指令設定日誌檔案描述符的快取。
語法
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
max
設定快取中最多容納的檔案描述符數量,如果被佔滿,採用LRU演算法將描述符關閉。
inactive
設定快取存活時間,預設是10s。
min_uses
在inactive時間段內,日誌檔案最少使用幾次,該日誌檔案描述符記入快取,預設是1次。
valid
:設定多久對日誌檔名進行檢查,看是否發生變化,預設是60s。
off
:不使用快取。預設為off。
基本用法
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
它可以配置在 http
、 server
、 location
作用域中。
例子中,設定快取最多快取1000個日誌檔案描述符,20s內如果快取中的日誌檔案描述符至少被被訪問2次,才不會被快取關閉。每隔1分鐘檢查快取中的檔案描述符的檔名是否還存在。