Apache HTTP Server で、logrotate したくないとき、CustomLog や ErrorLog を日付別に出したい。調べてみると、次の二つのがメジャーのようだ。
- Apache HTTP Server に付属している rotatelogs
- cronolog
どちらもパイプ経由でアクセスの多いサーバだと重いかなと懸念していたんだけれど、開発を依託している技術者から mod_log_rotate という Apache モジュールがあることを教えてもらった。
さっそく、Apache HTTP Server 2.2.11 で試していた。
インストールは、wiki にあるとおり、次のコマンドを実行するだけ
$ sudo apx -i -a -c mod_log_rotate.c
続いて、次のように設定する。
LoadModule log_rotate_module modules/mod_log_rotate.soRotateLogs OnRotateLogsLocalTime On
RotateLogsLocalTime On がないと、ログのファイル名の日時が UTC になるので注意。あとは、CustomLog に次のような設定する。
CustomLog “/var/log/httpd/access_log.%Y%m%d” combined
このように設定すると、/var/log/httpd/access_log.YYYYMMDD というファイル名になる。ErrorLog は、Apache の仕様でハンドリングできないということで ErrorLog の方は出力されないのが普通なので cronolog を使うことにした。rotatelogs は、ある時間ごとにアクセスログを切替える機能なのでアクセスログに日付をつけたいときは使えない。
mod_log_rotate も、本番に投入するため RPM にした。SPEC ファイルは、このあたりのをカスタマイズして使った。
VirtualHost を使っている場合は、必ず VirtualHost ごとに CustomLog の設定が必要なので要注意。設定しないと、access_log.[UINX タイムスタンプ] でアクセスログが出力されてしまう。
あとは、古いログを cron かなんかで削除してあげればよい。
もちろん、最良なのはアクセスログなど不要な情報は /dev/null にするのが当然だと思う。とはいってもどうしても必要なログはあるわけなので、そういうときは mod_log_rotate を使うのがいい感じ。
今のところ、大きな問題はないけれど0時ちょうどになると、次のようなログが出力されることだ。
[Mon Feb 02 00:00:00 2009] [error] (13)Permission denied: could not open transfer log file /dev/null.1233532800.
これは、mod_log_rotate.c を変更すればなおせそうな感じだけれど。今晩、様子をみてみることにする。
ちなみに、mod_log_rotate が組み込まれているときの設定したときは、次のように設定すればよい。
## mod_log_rotate# http://www.hexten.net/wiki/index.php/Mod-log-rotate#<IfModule log_rotate_module>RotateLogs OnRotateLogsLocalTime On</IfModule>
Tags: apache







> rotatelogs は、ある時間ごとにアクセスログを切替える機能なのでアクセスログに日付をつけたいときは使えない。
CustomLog “|/usr/local/apache/bin/rotatelogs /var/log/access_log.%Y-%m-%d 86400 540″ combined
とかじゃだめな感じでしょうか。全然話し食い違っていたらすみません。
あと、パイプ経由だと重いとかあるんですね。気にしたことがありませんでした。
コメントありがとうございます。
rotatelogs について勘違いしていました。やっぱりできるんですね。ヘルプドキュメントにかかれていなかったのでてっきりできないかと思い込んでいました。
あと、パイプ経由については Apache 内部の仕組みを調べてみたので、別のエントリで書きます。調べた結果、それほど気にする必要はないことが分かりました。。。
[...] 先日、紹介した mod_log_rotate ですが、とあるサーバで次のような設定をしたところちゃんとアクセスログがまったく ローテートしなくなってしまいました。 CustomLog “logs/access_log.%Y%m% [...]