1. 程式人生 > 實用技巧 >nginx 日誌功能詳解

nginx 日誌功能詳解

nginx 日誌功能

在 nginx 中有兩種日誌:

  • access_log:訪問日誌,通過訪問日誌可以獲取使用者的IP、請求處理的時間、瀏覽器資訊等
  • error_log:錯誤日誌,記錄了訪問出錯的資訊,可以用於定位錯誤的原因

設定 access_log

訪問日誌主要用於記錄客戶端的請求。客戶端向 nginx 伺服器發起的每一次請求都會被記錄到 access_log 中。

包含請求 IP、時間、訪問 url 等等,當然訪問日誌中具體記錄哪些日誌資訊我們可以通過 log_format 設定。

access_log 指令語法

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 設定訪問日誌
access_log off; # 關閉訪問日誌 - path 表示指定日誌存放位置
- format 表示日誌格式即日誌中記錄的內容
- buffer 用於指定日誌寫入時的快取大小,預設 64k
- gzip 日誌寫入前先壓縮。壓縮率可以指定,從1到9數值越大壓縮比越高,同時壓縮的速度也越慢,預設1
- flush 設定快取的時間,如果超過flush指定的時間,快取中的內容將被清空
- if 判斷條件,如果指定的條件計算為0或空字串,那麼該請求不會被寫入日誌

設定 buffer 的目的,是為了避免高頻對磁碟進行讀寫操作,即暫時先不將日誌寫入磁碟,而是存入記憶體中,等達到了設定快取大小之後再一次性寫入。

注意 flush 指令是和 buffer 一起使用的,即指定 buffer=size 之後,如果超過 flush 指令設定的時間仍然未達到快取區大小,則也會被寫入到磁碟,沒有 buffer 而只有 flush 則會報錯。

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.conf 檔案中 access_log 預設是關閉的:

去掉註釋:

access_log 日誌檢視

通過 cat 命令檢視日誌:

它的格式為:

127.0.0.1 - - [21/Jul/2020:21:10:27 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36" "-"

1. $remote_addr(客戶端(使用者) IP地址) 127.0.0.1
2. $remote_user(需要在基於認證規則的時候,才有) ''
3. $time_local(訪問時間) 21/Jul/2020:21:10:27 +0800
4. $request(請求的 url 地址) "GET / HTTP/1.1"
5. $body_bytes_sent(nginx返回給客戶端的響應體的位元組數,即不含響應頭) 0
6. $status(請求狀態) 304
7. $http_referer(請求來源) "-"
8. $http_user_agent(客戶端資訊) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
9. $http_x_forwarded_for(表示 HTTP 請求端真實 IP) "-"

我們也可以根據自己需要日誌資訊在 nginx 配置檔案中修改日誌格式。

設定 error_log

error_log 錯誤日誌,記錄了訪問出錯的資訊,可以用於定位錯誤的原因。

error_log 指令語法

error_log file [level];

第一個引數指寫入錯誤日誌的路徑

第二個引數指日誌的級別。level 可以是:debug、info、notice、warn、error、crit、alert、emerg 中的任意值。只有日誌的錯誤級別大於等於level 指定的值才會被寫入錯誤日誌中,預設值是 error。

error_log 配置示例

error_log logs/error.log error;

error_log 日誌檢視

2020/07/21 18:21:47 [emerg] 57325#0: bind() to 0.0.0.0:9000 failed (48: Address already in use)

1. 發生錯誤時間:2020/07/21 18:21:47
2. 日誌級別:emerg
3. 詳細資訊:bind() to 0.0.0.0:9000 failed (48: Address already in use)

參考文章

  1. https://www.cnblogs.com/aoniboy/p/4866395.html
  2. https://www.cnblogs.com/leeyongbard/p/10880356.html