Apacheログのローテーション

  • 投稿日:
  • by
  • カテゴリ:
  • ハッシュタグ:

例のアクセスカウンターの件で、Apacheのログを見てみようと思ったら、Access_logの大きさがなんと 10GB超!!!
自宅サーバーを立ち上げて以来、ローテーションしてなかったからです(汗)。

FreeBSDのログは、最初から logrotate が働いているので意識してなかったんですが、Apacheは別に設定が必要なんですね。

ログローテーションとAnalogの導入

logrotateでApacheのログをローテーションさせるなら、/etc/logrotate.confに設定を追加するだけでOKだ。しかし、Apacheにはログローテーションを行う独自のプログラムが付属している。それが「rotatelogs」である。(中略)
 
logrotateは、logrotate.confで指定した世代数(rotateで指定)を超えると、それより古いものは自動的に削除する。それに対し、rotatelogsは管理する世代数を設定しない。そのため、切り出したログファイルは管理者の手で消されるまでディスク上に保存されることになる。2つ目の違いは、logrotateが切り出し後のログファイルをクリアするのに対し、rotatelogsはログファイルをクリアしないことである。

さっそくやってみました。 ちゃんと働いているようです。

httpd.conf に log_config_module のディレクティブがあるので、そこの

CustomLog /var/log/httpd-access.log combined

のところを、

CustomLog /var/log/apache/httpd-access.log combined
TransferLog "|/usr/local/sbin/rotatelogs -l /var/log/apache/httpd-access.log 604800"

に変更しました(ログを書くディレクトリも変更しています)。

CustomLog "|/usr/local/sbin/rotatelogs -l /var/log/apache/httpd-access.log 604800" combined

と記述してもよかったんですが、ログファイル名が httpd-access.log.1251331200 みたいになってしまうんですよね。
TransferLog を併記すると、httpd-access.log と httpd-access.log.1251331200 の両方が出来ました。 もっといい方法があると思うんですが、あまり深く突っ込みませんでした。
httpd-error.log の方は、ローテートさせてません。 大きくなったら手動で消します。


ついでに、Analog もportsから入れてみました。 一応、今までも Webalaizer を使ってはいるんですが。

重要なのは、Analogが分析して表示できるのは分析対象としたログファイルの範囲に限られるということだ。これは当たり前のことだが、日別に切り出したログを分析させれば、その日の分だけを対象に分析が行われる。すなわち、ほかの日との比較は、出力結果を自分で見比べるしかないということである。必要であれば、分析対象とするログファイルを複数にすればよい。ただし、あまり多くのログ(例えば1年分)を分析させると、それだけ時間もかかる。どの単位で分析するか、試しながら調整していくしかないだろう。

とりあえず、rotatelogsの切り出し単位(時間)は、604800秒(一週間)にしてあります。