文章原創於公眾號:程序猿周先森。本平台不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。
眾所周知,線上如果出現事故我們通常都是查看日志去進行問題定位並且進行修復。使用好Nginx日志有利於我們線上進行修復異常問題。在Nginx中日志主要分為兩種:access_log(訪問日志)和error_log(錯誤日志)。通過查看access_log我們可以查看用戶ip,瀏覽器信息及請求時間等信息,通過查看error_log我們可以查看線上出錯的具體信息,可以幫助我們定位異常的原因。本篇文章主要帶領大家詳細了解Nginx如何配置日志。本文將會涉及到的日志配置指令:
- access_log
- log_format
- open_log_file_cache
- log_not_found
- log_subrequest
- rewrite_log
- error_log
access_log指令
首先,我們可以先看看access_log指令。access_log命令可以配置訪問日志。我們可以先看下access_log指令的語法結構:
- access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 設置訪問日志
- access_log off; # 關閉訪問日志
我們先來看看語法結構中的參數的含義:
- path: 指定日志的存放位置
- format: 指定日志的格式,非必填,默認為預定義的combined
- buffer:指定日志寫入時的緩存大小,非必填,默認64k
- gzip: 日志寫入前先進行壓縮
- flush: 設置緩存的有效期
- if: 設置條件判斷,當天劍成立時才會寫入日志
- off: 值為off表示不開啟日志,值為on表示開啟日志
access_log指令可以使用於http根節點,虛擬服務器server節點,上下文配置location以及limit_except中。無法在其他作用域使用access_log指令,否則Nginx會報錯。我們可以看一個簡單的配置access_log的小例子:
- access_log /root/.pm2/logs/niyueling.log buffer=32k gzip flush=5m
這個配置指定日志存儲路徑為/root/.pm2/logs/niyueling.log,日志使用默認格式combined。日志緩存大小為32k,日志寫入前會進行gzip壓縮,緩存有效期為5分鍾。
log_format指令
剛才有講過如果未指定日志格式,Nginx會使用combined日志格式為默認格式。combined日志格式默認使用格式為:
- log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
但是如果不想使用combined日志格式,就可以使用log_format指令來自定義格式內容。log_format指令需要在http節點下進行配置。我們先來看下log_format指令的語法結構:
- log_format name [escape=default|json] string;
我們先來看看log_format的參數對應的用法:
- name: 指定日志格式名稱,因為在access_log指令中需要指定日志格式
- escape: 設置字符編碼方式,可以選擇default或者json
- string: 要寫入日志的內容,可以有多個參數,可以使用Nginx變量。
下面貼一下log_format指令中常用的一些變量:
我們可以接着看個自定義日志格式的小案例:
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$gzip_ratio" $request_time $bytes_sent $request_length';
server {
server_name www.niyueling.cn;
access_log /root/.pm2/logs/niyueling.log main;
}
}
open_log_file_cache指令
對於網站的訪問記錄,通常操作都是首先打開日志文件,然后寫入日志記錄,最后關閉文件。默認情況下日志文件不進行緩存的,我們可以通過open_log_file_cache指令設置日志文件緩存。open_log_file_cache指令可以配置在http根節點,虛擬服務器server節點以及上下文location中。我們先看下open_log_file_cache指令的語法結構:
- open_log_file_cache max=X [inactive=time] [min_uses=N] [valid=time];
- open_log_file_cache off;
首先先貼下參數對應的含義:
- max: 設置緩存中的最大文件描述符
- inactive: 設置存活時間
- min_uses: 在存活時間內,日志文件最少被使用幾次后將日志文件描述符寫入緩存。
- valid: 設置檢查頻率
- off: 禁用日志緩存
可以看一個簡單配置日志緩存的小例子:
- open_log_file_cache max=100 inactive=30s valid=5m min_uses=3;
log_not_found指令
這個命令用於指定是否在error_log錯誤日志中記錄不存在的錯誤,如文件不存在等。默認值為是。我們可以先看下語法結構:
- log_not_found on | off;
log_not_found指令可以配置在http根節點,虛擬服務器server節點以及上下文location中。設置為on表示記錄不存在的錯誤,設置為off表示不記錄不存在的錯誤。
log_subrequest指令
log_subrequest指令用於指定在access_log訪問日志中是否記錄子請求的訪問記錄。默認情況為不記錄,貼下語法結構:
- log_subrequest on | off;
log_subrequest指令可以配置在http根節點,虛擬服務器server節點以及上下文location中。設置為on表示記錄子請求訪問記錄,設置為off表示不記錄子請求訪問記錄。
rewrite_log指令
rewrite_log指令由ngx_http_rewrite_module模塊提供服務,用來記錄日志重寫。可以在error_log錯誤日志中記錄notice級別的重寫日志。默認是不啟用狀態,貼下語法結構:
- rewrite_log on | off;
rewrite_log指令可以配置在http根節點,虛擬服務器server節點以及上下文location以及if條件判斷中。設置為on表示在錯誤日志中記錄notice級別的重寫日志,設置為off表示在錯誤日志中不記錄notice級別的重寫日志。
error_log指令
error_log指令顧名思義,就是用來指定錯誤日志的,一般來說線上出現bug都是通過error_log日志來定位問題所在而加以解決的。error_log指令可以記錄服務器和請求處理過程中的錯誤信息。我們先看下error_log指令的語法結構:
- error_log file [level];
參數含義其實很容易可以理解:
- file: error_log 存放路徑
- level: 日志級別,只有日志級別高於指定級別才會記錄到error_log中
- error_log指令可以配置在http節點,main節點,虛擬服務器server節點以及上下文location中。
日志切割
Nginx記錄日志默認情況下是訪問日志全部寫入access_log中,錯誤日志全部寫入error_log中。這樣會導致日志文件原來越大,不利於查看日志分析問題異常,所以我們可以將日志以日期為單位進行切割。首先需要寫一個腳本實現Nginx按天切割:
日志保存位置
- base_path='/root/.pm2/logs/niyueling.log'
獲取當前年信息和月信息
- log_path=$(date -d yesterday +"%Y%m")
獲取昨天的日信息
- day=$(date -d yesterday +"%d")
按年月創建文件夾
- mkdir -p $base_path/$log_path
備份昨天的日志到當月的文件夾
- mv $base_path/access.log $base_path/$log_path/access_$day.log
輸出備份日志文件名
- echo $base_path/$log_path/access_$day.log
通過Nginx信號量控制重讀日志
- kill -USR1
cat /opt/nginx/logs/nginx.pid
然后給腳本添加可執行權限,最后添加Linux定時任務:
- crontab -e
每天凌晨兩點半進行日志分割
- 30 02 0 * * * /root/.pm2/logs/splitLog.sh
** 重啟Linux定時任務**
- crond restart
通過上面的講解差不多可以知道Nginx對於日志是如何進行配置的,實際上就是通過log_format配置日志格式,如果log_format中使用了Nginx變量,則可以通過open_log_file_cache指令來設置緩存提高性能。然后通過access_log進行設置訪問日志,通過error_log指令設置錯誤日志。最后實現定時任務定時切割每天的日志,有利於我們后期維護。
如果喜歡我的文章,歡迎關注個人公眾號:程序猿周先森。