Nginx日誌配置詳解

antwang發表於2018-03-08

前言

Nginx日誌對於統計、系統服務排錯很有用。Nginx日誌主要分為兩種:access_log(訪問日誌)和error_log(錯誤日誌)。通過訪問日誌我們可以得到使用者的IP地址、瀏覽器的資訊,請求的處理時間等資訊。錯誤日誌記錄了訪問出錯的資訊,可以幫助我們定位錯誤的原因。本文將詳細描述一下如何配置Nginx日誌。

設定access_log

訪問日誌主要記錄客戶端的請求。客戶端向Nginx伺服器發起的每一次請求都記錄在這裡。客戶端IP,瀏覽器資訊,referer,請求處理時間,請求URL等都可以在訪問日誌中得到。當然具體要記錄哪些資訊,你可以通過log_format指令定義。

語法

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 設定訪問日誌
access_log off; # 關閉訪問日誌

複製程式碼
  • path 指定日誌的存放位置。
  • format 指定日誌的格式。預設使用預定義的combined
  • buffer 用來指定日誌寫入時的快取大小。預設是64k。
  • gzip 日誌寫入前先進行壓縮。壓縮率可以指定,從1到9數值越大壓縮比越高,同時壓縮的速度也越慢。預設是1。
  • flush 設定快取的有效時間。如果超過flush指定的時間,快取中的內容將被清空。
  • if 條件判斷。如果指定的條件計算為0或空字串,那麼該請求不會寫入日誌。

另外,還有一個特殊的值off。如果指定了該值,當前作用域下的所有的請求日誌都被關閉。

作用域

可以應用access_log指令的作用域分別有httpserverlocationlimit_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 name [escape=default|json] string ...;
複製程式碼
  • name 格式名稱。在access_log指令中引用。
  • escape 設定變數中的字元編碼方式是json還是default,預設是default
  • string 要定義的日誌格式內容。該引數可以有多個。引數中可以使用Nginx變數。

下面是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://daojia.com/”

下面演示一下自定義日誌格式的使用:

access_log /var/logs/nginx-access.log main
log_format  main  `$remote_addr - $remote_user [$time_local] "$request" `
                  `$status $body_bytes_sent "$http_referer" `
                  `"$http_user_agent" "$http_x_forwarded_for"`;

複製程式碼

我們使用log_format指令定義了一個main的格式,並在access_log指令中引用了它。假如客戶端有發起請求:https://suyunfe.com/,我們看一下我擷取的一個請求的日誌記錄:

112.195.209.90 - - [20/Feb/2018:12:12:14 +0800] "GET / HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" "-"

複製程式碼

我們看到最終的日誌記錄中$remote_user$http_referer$http_x_forwarded_for都對應了一個-,這是因為這幾個變數為空。

設定error_log

錯誤日誌在Nginx中是通過error_log指令實現的。該指令記錄伺服器和請求處理過程中的錯誤資訊。

語法

配置錯誤日誌檔案的路徑和日誌級別。

error_log file [level];
Default:	
error_log logs/error.log error;

複製程式碼

第一個引數指定日誌的寫入位置。

第二個引數指定日誌的級別。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值。可以看到其取值範圍是按緊急程度從低到高排列的。只有日誌的錯誤級別等於或高於level指定的值才會寫入錯誤日誌中。預設值是error

基本用法

error_log /var/logs/nginx/nginx-error.log

複製程式碼

它可以配置在:mainhttp, mail, stream, server, location作用域。

例子中指定了錯誤日誌的路徑為:/var/logs/nginx/nginx-error.log,日誌級別使用預設的error

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_usesinactive時間段內,日誌檔案最少使用幾次,該日誌檔案描述符記入快取,預設是1次。
  • valid:設定多久對日誌檔名進行檢查,看是否發生變化,預設是60s。
  • off:不使用快取。預設為off。

基本用法

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
複製程式碼

它可以配置在httpserverlocation作用域中。

例子中,設定快取最多快取1000個日誌檔案描述符,20s內如果快取中的日誌檔案描述符至少被被訪問2次,才不會被快取關閉。每隔1分鐘檢查快取中的檔案描述符的檔名是否還存在。

總結

Nginx中通過access_logerror_log指令配置訪問日誌和錯誤日誌,通過log_format我們可以自定義日誌格式。如果日誌檔案路徑中使用了變數,我們可以通過open_log_file_cache指令來設定快取,提升效能。

另外,在access_loglog_format中使用了很多變數,這些變數沒有一一列舉出來,詳細的變數資訊可以參考Nginx官方文件

相關文章