天天看點

Nginx日志檔案格式及切割日志檔案

        作為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問題解決 

        通過參考上述内容可以快速的定制出來一個日志格式了,就在上一次做的虛拟主機裡增加吧。

Nginx日志檔案格式及切割日志檔案

        上次并沒有自定義日志格式并且在限制通路的狀态頁面也沒有啟用通路日志,那就寫一個吧。

        log_format access '$remote_addr $remote_user "$time_local" $request'
                        '$status $http_referer'
                        '"$http_user_agent" $http_x_forwarded_for';      

        添加的名稱為access 日志記錄了ip、使用者、時間、相應方法及頁面、狀态碼、從哪個連結過來的、使用者代理、如果中間有代理也從代理擷取使用者ip,然後将狀态頁面的通路日志打開并且給一個檔案路徑(此檔案可以不存在,目錄必須存在)然後在路徑後面指定好我們剛才設定的名稱,也将正常頁面的通路日志引用自定義的日志格式。(原來是沒有設定名稱的,那麼就為預設格式)

Nginx日志檔案格式及切割日志檔案

        定義完成後看下是否配置正确

nginx -t      
Nginx日志檔案格式及切割日志檔案

        nginx給了一個警告資訊,警告我們log_format可能使用在/usr/local/nginx/nginx.conf中的http等級下,如果要修複這個警告按照以下方法即可解決。

        将我們的自定義資訊放入到nginx.conf配置檔案中的http裡面(一定要在虛拟主機的配置檔案中删除自定義的log_format):

Nginx日志檔案格式及切割日志檔案

        再次檢查即可正常使用

Nginx日志檔案格式及切割日志檔案

        将原來的access.log檔案删除或者重命名,然後重讀配置檔案

cd /web/vhost/test1/logs/
mv test1.access.log access.log.bak
nginx -s reload    #重讀配置檔案      

        然後通路下看看日志檔案是否和我們自定義的内容一樣:

Nginx日志檔案格式及切割日志檔案

        狀态頁面的通路日志裡記錄了ip、使用者名、時間、請求方法、、通路的頁面、頁面狀态碼(由于定義的時候沒有加“-”導緻了效果不太好)、用戶端使用的浏覽器、以及代理伺服器(本機通路的沒有代理伺服器是以就為-)

        自定義日志就結束了,接下來就是切割日志檔案并且每天儲存一份當天的日志檔案方法如下:

        首先将原來的日志檔案重命名

mv test1.access.log test1.2014-12-29.log
nginx  -s reload      
#!/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目錄添加至系統環境變量中。      
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      

繼續閱讀