apacheサーバのログローテーション

apacheのメインのログはアクセスログとエラーログ。アクセスログの出力先はCustomLogディレクティブ(あるいはTransferLogディレクティブ)にて指定され、エラーログはErrorLogディレクティブで指定される。

ログをローテーションしたい場合、apache停止時に手動(シェル)で動かすか、cronでlogrotateを使用するか、あるいはどちらのディレクティブもパイプ機能が使えるので、ログ出力をrotatelogsというapacheの標準ツールに引き渡す手もある。

Fedora 9にapacherpmでインストールすると、設定は以下の通り。

$ cat httpd.conf
~
ErrorLog logs/error_log
~
CustomLog logs/access_log combined
~

どちらも第一引数が出力先。ちなみにcombinedはLogFormatディレクティブで指定された出力書式のニックネーム。
CustomLogディレクティブはログの書式と出力先の両方を設定できる。

話を戻して出力先をパイプにしてrotatelogに渡す方法は以下の通り。

ErrorLog "|/usr/sbin/rotatelogs /etc/httpd/logs/error_log.%Y%m%d 86400"
CustomLog "|/usr/sbin/rotatelogs/etc/httpd/logs/logs/access_log.%Y%m%d 86400" combined

ファイルの後ろで指定しているの%は、ファイルの作成時点の日付に変換される。
ちなみに何も指定しないとdate +'%s'で表示される、UTC(協定世界時)の1970年1月1日0時0分0秒からの秒数がファイル名の後ろにくっつく。

ファイルの次の引数がローテート条件。時間(秒)かサイズ(M)で指定可能。
ちなみにrotatelogsはどうもSELinuxの設定次第でpermission deniedを喰らうので注意。