logrotate を使って Apache のログファイルを月単位でまとめているのだが,バージョンアップをしてから動作がおかしくなった (logrotate 3.7.4)。後処理用のシェルが変数を展開しないのである。
このサイトでは,Apache のログファイルを logrotate を使って月単位でまとめている。先日,OS を Vine Linux 3.2 から 4.1 に変更したところ,そのときから動作がおかしくなったのである。Vine Linux 3.2 のときは正常に動作していた (nlog(n): Apache のログを月別に保存したい)。
Vine Linux 3.2 のときは logrotate 3.6.8,現在は Vine Linux 4.1 で logrotate 3.7.4 (logrotate-3.7.4-1vl1) である。logrotate はマイナーバージョンアップされている。
/etc/logrotate.d/apache2 の内容は次の通り。
1か月に1度ローテートし,ファイル名が access_log から access_log.1 に変更されるので,後処理で access_log.1 を access_log.200710 などのように年月をつけたファイル名に変更するというものである。
ローテートのステータスは /var/lib/logrotate.status に次のような形で記述されている。次のローテートは 2007-12-1 の予定となっている。
さて,この設定で前回は11月1日に処理がされたのだが,思惑通りに動作していない。access_log.200710 というファイル名になるはずなのだが,access_log.1 となってしまっている。どうやら postrotate ... endscript 間の処理において,apache2 の再起動はされているが,その後のシェルスクリプトが動作していないようだ。
対処法としては,/var/log/apache2/*/*_log をアスタリスクなしで書くことなのだが,バーチャルサーバを立てまくっているおかげでファイル数が多く,やっていられない。
仕方がないので,シェルスクリプトを書いて月に1度だけ手動で処理することにする。上記の logrotate 用のファイルから一部抜き出したものである。ファイル名を logrotmp.sh などとしておく。
注意すべきは,date コマンドに与える日付の数値である。今日は11月12日なので,13日より以前を指定する必要がある。日付を引いたときに先月になるような数値ならよいので,ここでは15を設定した。
まずはテスト。一般ユーザで行う。構文のチェックと変数展開のチェックをするように sh に -xv オプションをつける (nlog(n): Apache のログファイルを月別に分割したい)。
上手くいっているようなので,root になって実行。
このスクリプトを logrotate 用に書き換えて登録しておけば完全に自動化はできるが,気持ちが悪いのでパス。月に1度コマンドを打つくらいはやるか。あとは logrotate のフィックスを待つことにしよう。もし,仕様が変わってこの動作が正常なら,上記のスクリプトを logrotate 用に書き換えて登録である。
Master Archive Index
Total Entry Count: 1957