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で前日の日付でローテーションするオプションがあったら良いのになぁと思うところ。
最近のコメント