nginx 日誌功能詳解
阿新 • • 發佈:2020-07-21
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
需要注意,在 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)