logrotateでdateextとdelaycompressを手動で実現する方法
logrotateでは定期的にログをローテーションしてくれます。
ローテーションのオプションにもいくつかあって、今回は以下の2つについて取り上げます。
dateext:ファイル名末尾に日付をつけるdelaycompress:1つ前のファイル以外は圧縮する
dateextとdelaycompressを手動で実行するスクリプト
通常はこれらのオプションをつけるだけで良いのですが、あえてこれを手動で実装する場合があります。
その書き方は次のようにします。
なお、例はCentOSにおけるapacheのログファイルをローテーションするスクリプト、/etc/logrotate.d/httpdの場合です。
主な部分だけ記載しているのでご注意。
/etc/httpd/logs/*log {
daily # 日付でファイルを作るのでdailyにします
nocompress # 圧縮は手動でするため無効にします。
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
EXT1=`date +%Y%m%d` # 今日の日付
EXT2=`date +%Y%m%d -d '1 days ago'` # 昨日の日付
for f in $1; do
# ローテーションされたaccess_log.1のようなファイルを
# access_log-20120123のようなファイル名にします
if [ -e $f.1 ]; then
mv $f.1 $f-$EXT1;
fi
# 前日のログaccess_log.20120122のようなファイルを
# 圧縮してaccess_log-20120122.gzのようにします。
if [ -e $f-$EXT2 ]; then
gzip $f-$EXT2;
fi
done
endscript
}
注意点
/etc/logrotate.confは標準のままを想定。- 特に、このファイルに
dateextなどが書いてあるとダメです。
- 特に、このファイルに
- おそらくrotateオプション(ローテーション回数指定)は使えません。
- 手動で実装しましょう。
rm -f `find $f-????????.gz -daystart -mtime +365`とかをpostrotateに書くことで何とかします(未確認)。
手動で実行するメリット
通常これらは、標準のオプション(つまり、dateextやdelaycompress)を使うことで対処可能です。
ところが、ログローテーションの時刻はcron.dailyの実行時刻(/etc/crontab)に依存し、CentOSではデフォルトで毎日04:02に実行されます。
もしcron.dailyの実行時刻を00:02などに設定した場合、ログのファイル名に反して大半が前日のログ(前日00:02から当日00:02頃)で埋もれてしまうことになります。
非常に残念な感じですね。
これは非常に些細なことですが、気になる人には気になるようで、それならファイル名を前日の日付にすれば良いじゃないか、となる訳です。
# もちろん、cron.dailyの実行時刻を23:50頃にする事でも、似たような解決になることはなりますが。
そういった人に、この方法は助けをくれます。
実現方法
前日の日付でローテーションするとなれば、それをどう実現するか。
はい、上記の方法を用います。
但し上記の方法は単にdateextとdelaycompressを実現しただけ。
これを前日の日付にする場合は、上記のコードのEXT1, EXT2の行を次のように修正します。
EXT1=`date +%Y%m%d -d '1 days ago'` # 昨日の日付 EXT2=`date +%Y%m%d -d '2 days ago'` # 一昨日の日付
こうすれば、前日の日付でローテーションされます。
個人的にはlogrotateで前日の日付でローテーションするオプションがあったら良いのになぁと思うところ。

最近のコメント