Sharing

2013年7月11日 星期四

Logrotate not rotate the log?!

logrotate 幫忙你定期整理 log, 像是壓縮起來, 或是清理掉過期的檔案, 才能避免硬碟因為過多的 log 而再也不能寫入, 鳥哥的文章也寫的很清楚
http://linux.vbird.org/linux_basic/0570syslog.php#rotate

但 logrotate 也是有不能處理的狀況

狀況 1:log 檔的檔名不固定

最近在使用 graphite-carbon, 他內部有自己 rotate log 檔的機制, 所以當你打開 /var/log/carbon/ 時, 他的檔案可能像這樣
但他沒有做壓縮, 也沒有定期清除過期的檔案, 所以你還是想加一條 rule 進去 logrotate

/var/log/carbon$ ll
total 575048
drwxr-xr-x 2 www-data www-data     12288 Jul 11 00:03 ./
drwxr-xr-x 3 www-data www-data      4096 Jun  4 04:23 ../
-rw-r--r-- 1 www-data www-data     10673 Jul 11 03:47 console.log
-rw-r--r-- 1 www-data www-data     75481 Jul 10 23:59 console.log.2013_7_10
-rw-r--r-- 1 www-data www-data     83080 Jul  9 23:58 console.log.2013_7_9
-rw-r--r-- 1 www-data www-data     13303 Jul  8 23:59 console.log.2013_7_8
-rw-r--r-- 1 www-data www-data    300053 Jul 11 03:47 creates.log
-rw-r--r-- 1 www-data www-data   2356541 Jul 10 23:59 creates.log.2013_7_10
-rw-r--r-- 1 www-data www-data   2930068 Jul  9 23:59 creates.log.2013_7_9
-rw-r--r-- 1 www-data www-data    198027 Jul  8 23:59 creates.log.2013_7_8
-rw-r--r-- 1 www-data www-data   1799225 Jul 11 03:47 listener.log
-rw-r--r-- 1 www-data www-data  11544506 Jul 10 23:59 listener.log.2013_7_10
-rw-r--r-- 1 www-data www-data  11706873 Jul  9 23:59 listener.log.2013_7_9
-rw-r--r-- 1 www-data www-data    568164 Jul  8 23:59 listener.log.2013_7_8
-rw-r--r-- 1 www-data www-data  45003650 Jul 11 03:47 query.log
-rw-r--r-- 1 www-data www-data 278004661 Jul 10 23:59 query.log.2013_7_10
-rw-r--r-- 1 www-data www-data 234139329 Jul  9 23:59 query.log.2013_7_9
-rw-r--r-- 1 www-data www-data     12797 Jul  8 23:59 query.log.2013_7_8

所以我試著加入這個 rule, 執行 logrotate -f graphite-carbon, 結果看起來很理想, 會把檔案壓縮起來

/var/log/carbon/*/*.log.*[!gz] {
        daily
        rotate 1
        compress
        missingok
        nocreate
}

然而隔幾天再來看的時候, 卻發現沒有發揮作用, 查了半天後才發現這是 logrotate 的機制
http://serverfault.com/questions/388066/logrotate-not-working
http://serverfault.com/questions/375004/logrotate-not-rotating-the-logs

在做 rotate 之前, 他會檢查 /var/lib/logrotate/status 內的日期, 如果距離上一次檢查的日期不到你指定的時間, ex daily => 一天以上, 那他是不會被 rotate 的, 所以你加入新機制的第一天, 在 status 內因為沒有紀錄, 所以他是不會發揮作用的, 第一天他唯一做的事是在 status 內加上一筆 record, 第二天之後才會正常運作. 那因為 carbon 每天產生的 log 檔名不是一致的, 所以在 status 內不可能有紀錄, 總要再多等一天才會被壓縮起來, 如果不能接受的話就可以改用 cron.daily 來執行, 就可以達到原本想要的效果

logrotate Debug 指令

# 執行一次並且把結果寫入 status, -v 把詳細的過程印出來
/usr/sbin/logrotate -v /etc/logrotate.conf
# 模擬執行一次,
/usr/sbin/logrotate -d /etc/logrotate.conf



沒有留言: