跳到主要內容

自訂Apache的日誌檔輪替(Custom Apache log rotation behaviour on CentOS / RHEL)

1. 若有設定虛擬主機的話,要先設定虛擬主機的日誌以及日誌內容的格式
<VirtualHost *:80>
    ServerName DNS網址
    DocumentRoot 網站目錄路徑
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
    CustomLog access_log的路徑 combined
</VirtualHost>
...
...
...
其中 LogFormat 與 CustomLog 的制定方式,在官方頁面有說明「Log Files說明頁面
2. apache的日誌設定完之後,就可以開始設定apache的logrotate功能。在開始定義之前,先解釋甚麼是logrotate。
logrotate顧名思義就是log rotate,即日誌的輪換。Logrotate是Linux系統自身帶的一個日誌輪替執行檔,它的執行檔所在的目錄是/usr/sbin/logrotate,是專門對各種系統日誌(syslogd,mail)進行輪替的執行檔。
所以logrotate 的主要功能就是將舊的日誌檔案移動成舊日誌檔, 並且重新建立一個新的空的日誌檔案來記錄,它的執行結果有點類似底下的圖示:
 

 
圖:登錄檔進行 logrotate 的結果 [鳥哥的 Linux 私房菜]

由上面的圖示我們可以清楚的知道,當第一次執行完 rotate 之後,原本的 messages 會變成 messages.1 而且會製造一個空的 messages 給系統來儲存登錄檔。而第二次執行之後,則 messages.1 會變成 messages.2 而 messages 會變成 messages.1 ,又造成一個空的 messages 來儲存登錄檔!那麼如果我們僅設定保留三個日誌檔而已的話,執行第四次時,則 messages.3 這個檔案就會被刪除,並由後面的較新的保存日誌檔所取代!那麼多久進行一次這樣的 logrotate 工作呢?這些都記錄在 logrotate.conf裡面,我們來看一下預設的 logrotate 的內容吧!

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.
由這個檔案的設定我們可以知道 /etc/logrotate.d 其實就是由 /etc/logrotate.conf 所規劃出來的目錄,所以,其實我們可以將所有的資料都給他寫入 /etc/logrotate.conf 即可,但是這樣一來這個檔案就實在是太複雜了,尤其是當我們使用很多的服務在系統上面時, 每個服務都要去修改 /etc/logrotate.conf 的設定也似乎不太合理~所以,如果獨立出來一個目錄,那麼每個以 RPM 打包方式所建立的服務的登錄檔輪替設定,就可以獨自成為一個檔案,並且放置到 /etc/logrotate.d/ 當中即可。

接下來就開始設定虛擬主機的logrotate。請於cd /etc/logrotate.d的目錄內新增一個檔案 vim vhost_logrotate,並於該檔案的內容貼上以下設定
若要更詳細的設定說明,在linuxcommand頁面有說明
虛擬主機的日誌擋位置/*log {
        daily #指定輪替周期為每日
        missingok #若日誌擋不存在就直接忽略,不會顯示在錯誤日誌擋內
        rotate 100 #保留輪替檔的數量
        compress #與delaycompress一起使用時,輪替的日誌檔到下一次輪替時才壓縮
        delaycompress #與compress一起使用時,輪替的日誌檔到下一次輪替時才壓縮
        notifempty #如果是日誌檔是空文件的話,不輪替
        create 640 root #輪替日誌檔時,使用指定日誌檔的權限與使用者
        #若有撰寫postrotate或postrotate必須用sharedscripts....endscript包起來
        sharedscripts
            postrotate #輪替完後要執行的命令
                /sbin/service httpd reload > /dev/null 2>/dev/null || true
        endscript
}
...
...
...
最後制訂要執行的輪替時間。Apache 的 Log Rotate 預設是靠 anacrontab 執行更換的, 所以每一天都會執行一次輪替。因為執行時間不一定,若要固定時間來執行logrotate,就開啟 vim cron.daily/logrotate設定檔給註解或刪掉(建議不要^^")
#!/bin/sh

#/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
#EXITVALUE=$?
#if [ $EXITVALUE != 0 ]; then
#    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
#fi
#exit 0
改透過CRONTAB來設定執行固定時間。其中/usr/sbin/logrotate是執行檔。
打開vim /etc/crontab,安插此指令,時間就看自己喜歡定在甚麼時候要輪替
59 23 * * * root /usr/sbin/logrotate -v -f /etc/logrotate.conf > /dev/null 2>&1
或是想要先手動執行輪替的話,就直接輸入以下指令來馬上執行。
/usr/sbin/logrotate -v -f /etc/logrotate.conf

留言

這個網誌中的熱門文章

巨型網站的分散式架構設計 (雲端運算的基礎)

網站初始: 架設網站入門其實很容易,很多網路上的免費資源運用一下,許多學生也可以自己建置網站,最基本的架構就是安裝一台Web server 及一台Database server,這樣的架構在流量不高的個人網站的確已足夠,但其實風險相當高,因為完全沒考慮到日後的擴充性(scalibility),也沒考慮到系統容錯及復原能力(High avability & Failover),因此只要流量一高,問題就接踵而至,但用這個架構可視為Close beta時期,多找一些親友來當免費測試員。 商業化架構: 在這時期代表已經籌到一筆資金,網站可以進行商業化架構設計,一般商業化考量下的標準架構,通常如下圖所示:

透過awk程式來計算網站流量

網路上有很多很多計算網站流量的分析工具....但是有時後自己想要知道如何分析,所以在網路上找到此指令可以計算網站的流量。 65.55.213.67 - - [04/Jul/2013:04:37:51 +0800] "GET /user.php?act=login HTTP/1.1" 200 10104 "-" "msnbot/2.0b (+http://search.msn.com/msnbot.htm)" 65.55.213.67 - - [04/Jul/2013:04:37:53 +0800] "GET /category.php?id=3 HTTP/1.1" 200 16041 "-" "msnbot/2.0b (+http://search.msn.com/msnbot.htm)" 65.55.213.67 - - [04/Jul/2013:04:37:56 +0800] "GET /category.php?id=1 HTTP/1.1" 200 11080 "-" "msnbot/2.0b (+http://search.msn.com/msnbot.htm)" 65.55.213.67 - - [04/Jul/2013:04:37:58 +0800] "GET /goods.php?id=351 HTTP/1.1" 200 19369 "-" "msnbot/2.0b (+http://search.msn.com/msnbot.htm)" 以上是從access_log擷取一部分的內容 再透過以下指令,就能計算出網站流量 cat /網站日誌檔目錄/access_log | awk '{SUM+=$10}END{print SUM/1024/1024}' 得出的流量數據是 0.054MB,因為流量數據是byte單位所以要除2次1024byte(56594/1024/1024) 其中 awk 是一種處理資料且可產生報告的語言,功能相當強大:而處理的單位是一行一行的比對處理,當符合awk的條件