文章原創於公衆號:程序猿周先森。本平臺不定時更新,喜歡個人文章,歡迎關注個人微信公衆號。nginx
衆所周知,線上若是出現事故咱們一般都是查看日誌去進行問題定位而且進行修復。使用好Nginx日誌有利於咱們線上進行修復異常問題。在Nginx中日誌主要分爲兩種:access_log(訪問日誌)和error_log(錯誤日誌)。經過查看access_log咱們能夠查看用戶ip,瀏覽器信息及請求時間等信息,經過查看error_log咱們能夠查看線上出錯的具體信息,能夠幫助咱們定位異常的緣由。本篇文章主要帶領你們詳細瞭解Nginx如何配置日誌。本文將會涉及到的日誌配置指令:json
access_log指令segmentfault
首先,咱們能夠先看看access_log指令。access_log命令能夠配置訪問日誌。咱們能夠先看下access_log指令的語法結構:瀏覽器
咱們先來看看語法結構中的參數的含義:緩存
access_log指令能夠使用於http根節點,虛擬服務器server節點,上下文配置location以及limit_except中。沒法在其餘做用域使用access_log指令,不然Nginx會報錯。咱們能夠看一個簡單的配置access_log的小例子:服務器
這個配置指定日誌存儲路徑爲/root/.pm2/logs/niyueling.log,日誌使用默認格式combined。日誌緩存大小爲32k,日誌寫入前會進行gzip壓縮,緩存有效期爲5分鐘。微信
log_format指令性能
剛纔有講過若是未指定日誌格式,Nginx會使用combined日誌格式爲默認格式。combined日誌格式默認使用格式爲:網站
可是若是不想使用combined日誌格式,就能夠使用log_format指令來自定義格式內容。log_format指令須要在http節點下進行配置。咱們先來看下log_format指令的語法結構:編碼
咱們先來看看log_format的參數對應的用法:
下面貼一下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指令的語法結構:
首先先貼下參數對應的含義:
能夠看一個簡單配置日誌緩存的小例子:
log_not_found指令
這個命令用於指定是否在error_log錯誤日誌中記錄不存在的錯誤,如文件不存在等。默認值爲是。咱們能夠先看下語法結構:
log_not_found指令能夠配置在http根節點,虛擬服務器server節點以及上下文location中。設置爲on表示記錄不存在的錯誤,設置爲off表示不記錄不存在的錯誤。
log_subrequest指令
log_subrequest指令用於指定在access_log訪問日誌中是否記錄子請求的訪問記錄。默認狀況爲不記錄,貼下語法結構:
log_subrequest指令能夠配置在http根節點,虛擬服務器server節點以及上下文location中。設置爲on表示記錄子請求訪問記錄,設置爲off表示不記錄子請求訪問記錄。
rewrite_log指令
rewrite_log指令由ngx_http_rewrite_module模塊提供服務,用來記錄日誌重寫。能夠在error_log錯誤日誌中記錄notice級別的重寫日誌。默認是不啓用狀態,貼下語法結構:
rewrite_log指令能夠配置在http根節點,虛擬服務器server節點以及上下文location以及if條件判斷中。設置爲on表示在錯誤日誌中記錄notice級別的重寫日誌,設置爲off表示在錯誤日誌中不記錄notice級別的重寫日誌。
error_log指令
error_log指令顧名思義,就是用來指定錯誤日誌的,通常來講線上出現bug都是經過error_log日誌來定位問題所在而加以解決的。error_log指令能夠記錄服務器和請求處理過程當中的錯誤信息。咱們先看下error_log指令的語法結構:
參數含義其實很容易能夠理解:
日誌切割
Nginx記錄日誌默認狀況下是訪問日誌所有寫入access_log中,錯誤日誌所有寫入error_log中。這樣會致使日誌文件原來越大,不利於查看日誌分析問題異常,因此咱們能夠將日誌以日期爲單位進行切割。首先須要寫一個腳本實現Nginx按天切割:
日誌保存位置
獲取當前年信息和月信息
獲取昨天的日信息
按年月建立文件夾
備份昨天的日誌到當月的文件夾
輸出備份日誌文件名
經過Nginx信號量控制重讀日誌
cat /opt/nginx/logs/nginx.pid
而後給腳本添加可執行權限,最後添加Linux定時任務:
天天凌晨兩點半進行日誌分割
重啓Linux定時任務
經過上面的講解差很少能夠知道Nginx對於日誌是如何進行配置的,實際上就是經過log_format配置日誌格式,若是log_format中使用了Nginx變量,則能夠經過open_log_file_cache指令來設置緩存提升性能。而後經過access_log進行設置訪問日誌,經過error_log指令設置錯誤日誌。最後實現定時任務定時切割天天的日誌,有利於咱們後期維護。
若是喜歡個人文章,歡迎關注我的公衆號:程序猿周先森。