作爲web服務器而言,日誌是必不可少的也是需要經常查看的。此篇就來介紹下如何自定義Nginx中的日誌格式以及使用crontab計劃任務來做到每天切割一次日誌文件從而做到方便管理。
在Nginx中日誌文件是由log_format這個指令來定義的,它的語法如下:
log_format name format ## name:指的是日誌格式的名稱(後面調用) ## format:設置日誌具體格式的
在Nginx中有自己默認的日誌格式,如下內容:
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"';
默認給註釋掉了,看一下解釋吧。
$remote_addr | 客戶端的ip地址(如果中間有代理服務器那麼這裏顯示的ip就爲代理服務器的ip地址) |
$remote_user | 用於記錄遠程客戶端的用戶名稱(一般爲“-”) |
$time_local | 用於記錄訪問時間和時區 |
$request | 用於記錄請求的url以及請求方法 |
$status | 響應狀態碼 |
$body_bytes_sent | 給客戶端發送的文件主體內容大小 |
$http_user_agent | 用戶所使用的代理(一般爲瀏覽器) |
$http_x_forwarded_for | 可以記錄客戶端IP,通過代理服務器來記錄客戶端的ip地址 |
$http_referer | 可以記錄用戶是從哪個鏈接訪問過來的 |
有時候可能就算啓用了$http_x_forwarded_for也無法獲取客戶端的ip地址詳情請參考此篇博文:nginx 日誌獲取不到遠程訪問ip問題解決
通過參考上述內容可以快速的定製出來一個日誌格式了,就在上一次做的虛擬主機裏增加吧。
上次並沒有自定義日誌格式並且在限制訪問的狀態頁面也沒有啓用訪問日誌,那就寫一個吧。
log_format access '$remote_addr $remote_user "$time_local" $request' '$status $http_referer' '"$http_user_agent" $http_x_forwarded_for';
添加的名稱爲access 日誌記錄了ip、用戶、時間、相應方法及頁面、狀態碼、從哪個鏈接過來的、用戶代理、如果中間有代理也從代理獲取用戶ip,然後將狀態頁面的訪問日誌打開並且給一個文件路徑(此文件可以不存在,目錄必須存在)然後在路徑後面指定好我們剛纔設置的名稱,也將正常頁面的訪問日誌引用自定義的日誌格式。(原來是沒有設置名稱的,那麼就爲默認格式)
定義完成後看下是否配置正確
nginx -t
nginx給了一個警告信息,警告我們log_format可能使用在/usr/local/nginx/nginx.conf中的http等級下,如果要修復這個警告按照以下方法即可解決。
將我們的自定義信息放入到nginx.conf配置文件中的http裏面(一定要在虛擬主機的配置文件中刪除自定義的log_format):
再次檢查即可正常使用
將原來的access.log文件刪除或者重命名,然後重讀配置文件
cd /web/vhost/test1/logs/ mv test1.access.log access.log.bak nginx -s reload #重讀配置文件
然後訪問下看看日誌文件是否和我們自定義的內容一樣:
狀態頁面的訪問日誌裏記錄了ip、用戶名、時間、請求方法、、訪問的頁面、頁面狀態碼(由於定義的時候沒有加“-”導致了效果不太好)、客戶端使用的瀏覽器、以及代理服務器(本機訪問的沒有代理服務器所以就爲-)
自定義日誌就結束了,接下來就是切割日誌文件並且每天保存一份當天的日誌文件方法如下:
首先將原來的日誌文件重命名
mv test1.access.log test1.2014-12-29.log nginx -s reload
這樣就可以做到日誌文件的切割。如果要每天自動保存的話就要基於crontab來管理了。寫個腳本吧
#!/bin/bash # # vhost=test1 ##定義虛擬主機的目錄名 log_path=/web/vhost/logs #指定日誌文件要保存位置 access_log_path=/web/vhost/${vhost}/logs #指定access日誌所在路徑 mkdir -p ${log_path}/$(date -d "yesterday" +"%y")/$(date -d "yesterday" +%m)/ ## 創建日期目錄,date -d "yesterday" +"%y"獲取年份後面那個是獲取月份 mv ${access_log_path}/${vhost}.access.log ${log_path}/$(date -d "yesterday" +"%y")/$(date -d "yesterday" +%m)/$(date -d "yesterday" +%d).${vhost}.access.log ## 這裏將訪問日誌文件移動到備份的目錄中如:/web/vhost/logs/14/12/28.test1.access.log nginx -s reload ##這裏我的nginx在編譯的時候使用--sbin-path=/usr/sbin/nginx這個參數了所以我可以直接使用nginx如果沒有使用此參數請一定要將你的nginx安裝目錄下的sbin目錄添加至系統環境變量中。
然後將這個腳本文件放到nginx的配置目錄下添加定時計劃
mkdir /usr/local/nginx/bin && mv logs.sh /usr/local/nginx/bin/logs.sh crontab -e 00 00 * * * /bin/bash /usr/local/nginx/bin/logs.sh
這樣在每天的夜晚12點就會自動創建備份文件了,如果要對錯誤日誌也每天備份的話按照上面的內容修改即可。