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)


