Nginx日誌對於統計、系統服務排錯頗有用。Nginx日誌主要分爲兩種:access_log
(訪問日誌)和error_log
(錯誤日誌)。經過訪問日誌咱們能夠獲得用戶的IP地址、瀏覽器的信息,請求的處理時間等信息。錯誤日誌記錄了訪問出錯的信息,能夠幫助咱們定位錯誤的緣由。本文將詳細描述一下如何配置Nginx日誌。html
access_log
訪問日誌主要記錄客戶端的請求。客戶端向Nginx服務器發起的每一次請求都記錄在這裏。客戶端IP,瀏覽器信息,referer,請求處理時間,請求URL等均可以在訪問日誌中獲得。固然具體要記錄哪些信息,你能夠經過log_format
指令定義。前端
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 設置訪問日誌
access_log off; # 關閉訪問日誌
複製代碼
combined
。另外,還有一個特殊的值off。若是指定了該值,當前做用域下的全部的請求日誌都被關閉。nginx
能夠應用access_log
指令的做用域分別有http
,server
,location
,limit_except
。也就是說,在這幾個做用域外使用該指令,Nginx會報錯。web
以上是access_log指令的基本語法和參數的含義。下面咱們看一幾個例子加深一下理解。算法
access_log /var/logs/nginx-access.log
複製代碼
該例子指定日誌的寫入路徑爲/var/logs/nginx-access.log
,日誌格式使用默認的combined
。json
access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m
複製代碼
該例子指定日誌的寫入路徑爲/var/logs/nginx-access.log
,日誌格式使用默認的combined
,指定日誌的緩存大小爲32k,日誌寫入前啓用gzip進行壓縮,壓縮比使用默認值1,緩存數據有效時間爲1分鐘。瀏覽器
Nginx預約義了名爲combined
日誌格式,若是沒有明確指定日誌格式默認使用該格式:緩存
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
複製代碼
若是不想使用Nginx預約義的格式,能夠經過log_format
指令來自定義。bash
log_format name [escape=default|json] string ...;
複製代碼
json
仍是default
,默認是default
。下面是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
都對應了一個-
,這是由於這幾個變量爲空。
錯誤日誌在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
複製代碼
它能夠配置在:main
, http
, mail
, stream
, server
, location
做用域。
例子中指定了錯誤日誌的路徑爲:/var/logs/nginx/nginx-error.log
,日誌級別使用默認的error
。
每一條日誌記錄的寫入都是先打開文件再寫入記錄,而後關閉日誌文件。若是你的日誌文件路徑中使用了變量,如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];
複製代碼
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
複製代碼
它能夠配置在http
、server
、location
做用域中。
例子中,設置緩存最多緩存1000個日誌文件描述符,20s內若是緩存中的日誌文件描述符至少被被訪問2次,纔不會被緩存關閉。每隔1分鐘檢查緩存中的文件描述符的文件名是否還存在。
Nginx中經過access_log
和error_log
指令配置訪問日誌和錯誤日誌,經過log_format
咱們能夠自定義日誌格式。若是日誌文件路徑中使用了變量,咱們能夠經過open_log_file_cache
指令來設置緩存,提高性能。
另外,在access_log
和log_format
中使用了不少變量,這些變量沒有一一列舉出來,詳細的變量信息能夠參考Nginx官方文檔