logrotateでローテート後のファイルを消さないようにする
しょーもないことだけど意外にできなかったので。。
rotateオプションあるいはmaxageオプションだと
man logrotateで出てくるsampleを例にとると
/var/log/messages { rotate 5 weekly postrotate /usr/bin/killall -HUP syslogd endscript }
こんな感じの設定だとして、この「rotate」オプションが世代管理の設定。
例の場合だと5世代残す設定になるわけだけど、これを世代管理なんかしなくて永久にファイルを残したい。
でもmanを見てみてもそれっぽいオプションがなさそう。
はじめ"rotate 0"かなーって考えてたけど"rotate 0"の場合は世代管理が0ってことで、1世代も残さずにローテート後のファイルが削除されちゃう。
If count is 0, old versions are removed rather than rotated.
manにはこんな感じの記述。
あとそれっぽいオプションにmaxageってのがあるけど、これは日数をキーとしてるだけで結局消えゆく運命は覆せないみたい。
sharedscriptsでログを退避させる
軽く調べたけど良い方法が見つからなかったので結局スクリプトでログを退避。
/var/log/messages { rotate 1 sharedscripts postrotate /usr/bin/killall -HUP syslogd BASE="/var/log/messages" DATE=`date -d '-1 day' +%Y%m%d` SRCFILE="$BASE.1" DSTFILE="$BASE.$DATE" if [ -f $SRCFILE -a ! -f $DSTFILE ]; then mv $SRCFILE $DSTFILE fi endscript }
上の例をそのまま使うとこんな感じ。
ローテーションされたファイルを日付けでリネーム。
まぁ単純だけどこんなんで良し。
圧縮したい場合は、mvのあとにgzip $DSTFILEするか、
またはcompressオプション使うならリネームするところはlastactionオプション使って分けたほうがいいかもしれない。