Ngxix 超詳細!Nginx 日誌配置實踐

2021-10-04 05:58:22 字數 4545 閱讀 6051

前言

nginx日誌對於統計、系統服務排錯很有用。

nginx日誌主要分為兩種:access_log(訪問日誌)和error_log(錯誤日誌)。通過訪問日誌我們可以得到使用者的ip位址、瀏覽器的資訊,請求的處理時間等資訊。錯誤日誌記錄了訪問出錯的資訊,可以幫助我們定位錯誤的原因。

本文將詳細描述一下如何配置nginx日誌。

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

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

access_log off; # 關閉訪問日誌

另外,還有乙個特殊的值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分鐘。

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 ...;
下面是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"

請求的referer位址。

客戶端瀏覽器資訊。

$remote_addr

客戶端ip

完整的原始請求行,如 "get / http/1.1"

$remote_user

客戶端使用者名稱,針對啟用了使用者認證的請求

$request_uri

完整的請求位址,如 ""

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

'"$http_user_agent" "$http_x_forwarded_for"';我們使用log_format指令定義了乙個main的格式,並在access_log指令中引用了它。假如客戶端有發起請求:我們看一下我擷取的乙個請求的日誌記錄:

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)

我們看到最終的日誌記錄中$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官方文件:

原文:juejin.im/post/5aa09bb3f265da238f121b6c

(完)

精選:2023年最新的常問企業面試題大全以及答案推薦閱讀:

http客戶端連線,選擇httpclient還是okhttp?

為什麼建議使用你 localdatetime ,而不是 date?

答應我,別再寫上千行的類了好嗎

springboot實現過濾器、***與切片

好文!必須點讚

Nginx的配置檔案詳解(超詳細)

1 安裝nginx 在安裝nginx之前,需確保系統已經安裝了gcc openssl devel pcre devel和zlib devel軟體庫。下面是nginx安裝過程 2 nginx的配置檔案結構nginx的配置檔案nginx.conf位於其安裝目錄的conf目錄下。nginx.conf由多個...

Nginx的配置檔案詳解(超詳細)

1 安裝nginx 在安裝nginx之前,需確保系統已經安裝了gcc openssl devel pcre devel和zlib devel軟體庫。下面是nginx安裝過程 2 nginx的配置檔案結構 nginx的配置檔案nginx.conf位於其安裝目錄的conf目錄下。nginx.conf由多...

Git命令 超詳細

初始化命令 git init 創立乙個.git隱藏資料夾 把所有的修改的檔案新增到大門口 git add 把倉儲門口的 放到裡面的房間中去 git commit m 一些說明 表示是把所有修改的檔案提交到版本庫 git commit all m 一些說明 檢視當前的狀態 git status 檢視歷...