読者です 読者をやめる 読者になる 読者になる

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オプション使って分けたほうがいいかもしれない。