Apacheを起動していると、いくつかのログファイルが作成される。これらを見ると、サイトの不具合や不審なアクセスを見つけたり、閲覧者の移動経路などを知ることができる。
しかしデフォルトの設定ではひたすらログをため続けるだけなので、ログファイルが巨大化してしまう。
ここでは、Apacheが作成するログファイルについての基礎知識と、基本的な管理方法を紹介する。
Apacheが作成するログには、以下の種類がある。
- アクセスログ
- 閲覧者がWebサーバの何かにアクセスすると、その結果が記録される。通常、ログファイルといえば、このファイルを指す。
デフォルトでは/usr/local/apache2/logsディレクトリ内に「access_log」という名前で作成される。- エラーログ
- 閲覧者がWebサーバの何かにアクセスした際、エラーになったものだけが記録される。このログを見ると、サーバに問題が起きていないかを確認できる。
デフォルトでは/usr/local/apache2/logsディレクトリ内に「error_log」という名前で作成される。- CGIエラーログ
- このログには、CGIスクリプトが発行するエラーだけが記録される。デフォルトでは作成されない。
- クッキーログ
- ユーザーの行動追跡に使われる。デフォルトでは作成されず、使用するにはmod_usertrackモジュールが必要。
デフォルトで作成されるのは「アクセスログ」と「エラーログ」で、それぞれ/usr/local/apache2/logsディレクトリに作成される。これらのログファイルは、例え
Apacheを再起動してもクリアされることは無く、ひたすらログを記録し続ける。Apacheの起動中はログを書き込むためにこれらのファイルは常に開いた状態であるため、メモリを消費してしまう。それどころか、ディスクアクセスやCPUの負荷を高めてしまうため、デフォルトの状態で使い続けていると、サーバのレスポンスを悪くしてしまう。
アクセスログファイルの設定は、httpd.conf内のCustomLog識別子で行われている。デフォルトでは次のとおり。
CustomLog logs/access_log common これは、Apacheがインストールされているディレクトリ(/usr/local/apache2)内の
logsディレクトリにaccess_logというファイル名でアクセスログファイルを作成するという意味である。
ファイル名の後ろのcommonは、ログのフォーマットを指定している。commonの内容は、同じくhttpd.conf内で次のように指定されている。
LogFormat "%h %l %u %t \"%r\" %>s %b" common httpd.confでは、共通ログ形式のcommon、拡張ログ形式(ECLF)のcombinedなど、いくつかのログ形式と形式名が定義されており、デフォルトではcommonが指定されているということになる。
Apache起動時、指定した場所にログファイルが存在しない場合、Apacheは新しいログファイルを作成する。つまり、ログファイルの巨大化を防ぐには、定期的にログファイルを別の名前に変更してやればよいことが判る。
とはいえ、これを手動でやるのは面倒である。Apacheにはrotatelogsというユーティリティが用意されており、このユーティリティをCustomLog指示子の出力先として指定すればよい。使い方は次のとおり。
CustomLog "|/usr/local/apache2/bin/rotatelog ログファイルのパス名 循環時間またはサイズ" 循環時間(秒単位)が経過するか、指定のサイズ(Mバイト単位)に達すると、指定されたファイル名にシステム時刻が拡張子としてつけられたログファイルが作られると共に、新しいログファイルが作成される。
これにより、複数のログファイルが作成されることになるが、オープンするログファイルの大きさを抑えることができるし、古いログファイルは必要なければ削除できる。循環時間を指定するときは、秒数を指定する。例えば1日ごとに別々のログファイルを作成したい場合、24時間を秒に直した86400と指定すればよい。
CustomLog "|/usr/local/apache2/bin/rotatelogs logs/access_log 86400" commonまた、10Mごとに切り替える場合、次のように指定する。
CustomLog "|/usr/local/apache2/bin/rotatelogs logs/access_log 10M" common設定を変更したら、Apacheを再起動する。
# /etc/rc.d/init.d/httpd graceful 再起動後、指定した時間(またはサイズ)になったら新しいログファイルが作成されるかどうかを確かめよう。
エラーログも同じように、ログをローテーションさせることができる。
ErrorLog "|/usr/local/apache2/bin/rotatelogs logs/error_log 86400" 必要ならローテーションさせればいいが、アクセスログとは違ってログ解析ツールにかけるわけではないので、cronで定期的に削除してしまえばいいような気がする。もちろん、チェックはしなければいけないが・・・