特集:システム管理 トラブルシューティングを目的としたApacheログ設定の調整法
FedoraにインストールしたApacheの場合、デフォルト設定下のアクセスログは/etc/httpd/logs/access_logに、エラーログは/etc/httpd/logs/error_logに保管される。このうちアクセスログに記録されるのは、リクエストに関する1行1項目形式の情報である。エラーログに記録されるのは、リクエストの日時、各イベントの重要度レベル、クライアントのIPアドレス、そしてエラーの内容である。エラーログの記録はApacheの中枢機能の1つだが、この種の情報の一部はmod_log_config、mod_dumpio、mod_log_forensicなどのモジュールで収集するようになっている。
アクセスログのフォーマットは、httpd.conf(Fedoraの場合は/etc/httpd/confディレクトリに収録)にある設定ディレクティブ LogFormat
によって変更できる。例えばフォーマット指定行における%b
はHTTPヘッダを除いたレスポンスサイズを、同じく%t
はリクエストの受信時刻をそれぞれアクセスログに含めるという指定である。具体的にはLogFormat "%v %h %u %t \"%r\" %>s %b"
というディレクティブ指定をしておけば、ログの記録対象として、サーバのcanonicalサーバ名、リモートホスト、認証済みリモートユーザ、リクエストの受信時刻、リクエストの先頭行、オリジナルリクエストの状態、レスポンスのバイトサイズが含まれるようになる。実際、トラフィック解析およびトラブルシューティングをする際には、必要となるすべての情報がアクセスログに記録されるよう、こうしたカスタマイズを施しておかなくてはならない。またログファイルの保管先を変更するには、httpd.confの CustomLog
および ErrorLog
ディレクティブを編集すればいい。
エラーログに関しては LogLevel
ディレクティブにて、ログ記録をトリガさせるイベントの種類を規定するようになっている。ログレベルの重要度を降順に並べると、emerg、alert、crit、error、warn、notice、info、debugという順番になり、LogLevel
での指定レベル以上の重要度を持つ全イベントがApacheによってエラーログに記録されていく。なおエラーログファイルのフォーマットは固定されているが、個々のリクエストに関するエラーについてはアクセスログにもその対応エントリが記録されるので、トラブルシューティングに必要な追加情報があれば、アクセスログ側をカスタマイズすることで取得できるはずである。
例えばApacheのログエラーを$INSTALLDIR/logs/に格納させるよう変更してみるなどは良い演習となるだろうが、httpd.confにあるErrorLog syslog:local7
などの設定ディレクティブを利用することでエラーイベントの記録先をsyslogにすることもできる。このディレクティブの意味は、local7と呼ばれるファシリティを用いてエラーログをsyslogに記録しろ、というApacheに対する指示である。syslogファシリティの詳細についてはmanページにあるsyslogdおよびsyslog.confの解説を参照して頂きたい。
フォレンジックログの取得
Apacheに用意されているmod_log_forensicは、いわゆるフォレンジック(forensic)解析をサポートするためのモジュールである。これを利用すると、特定ファイルに対するHTTPリクエストの全内容をログとして残しておくことができ、アクセス関連で発生する問題のトラブルシューティングに役立つことになる。このモジュールを読み込ませるには「LoadModule log_forensic_module modules/mod_log_forensic.so
」ディレクティブを使用すればよく、フォレンジックログファイルの指定はhttpd.confにある ForensicLog
ディレクティブで行える。
mod_log_forensicを読み込んだApacheは、個々のリクエストごとにforensic-idと呼ばれるユニークIDを付けた上で、これをフォレンジックログに記録していくようになる。ただしこのmod_log_forensicには、ログの記録フォーマット変更に関する機能は何も用意されておらず、個々のリクエストごとに2つのエントリを記録していくことしかできない。その1つ目のエントリは当該リクエストに関する詳細のすべてであり、例えばリクエストの全ヘッダ情報といった内容が各リクエストの処理前に記入されていく。2つ目のエントリは当該リクエストの処理後に記入される行であり、用途としては各リクエストの処理およびクライアント側でのページ保存に成功したことを示すためのものだが、実際にログファイル上に記録されるのは該当するforensic-idだけである。なおApacheにはcheck_forensicというスクリプトが付属しており、特別な処理をすることなく必要なリクエストを特定できるようになっている。こうして得られる情報は、処理に失敗したリクエストに共通するパターンを識別して対策を講じる際の参考となるはずだ。
ちなみに処理に成功したリクエストに対するエントリとしては、次のような文字列がフォレンジックログファイルに記録されていく。
+cfe:475e285e:0|GET /test.php HTTP/1.1|Host:192.168.1.33|User-Agent:Mozilla/5.0 (X11; U; Linux i686; en-US; rv%3a1.8.1.3) Gecko/20070417 Fedora/2.0.0.3-4.fc7 Firefox/2.0.0.3|Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5|Accept-Encoding:gzip,deflate|Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7|Keep-Alive:300|Connection:keep-alive -cfe:475e285e:0
mod_log_forensicの生成するforensic-idは他のモジュールで使用することもできる。例えばこの値をアクセスログに記入させるには、httpd.confのLogFormatディレクティブに%{forensic-id}n
と追加しておけばいい。この情報はアクセスログとフォレンジックログを対比させる際の識別用IDとして使えるはずだ。
フォレンジックログに記録されるのはリクエストに関する情報だけである。これだけではトラブルシューティングできない問題が生じるようであれば、mod_dumpioモジュールを用いてリクエストないしレスポンスの全体をエラーログファイルにダンプさせることもできる。このモジュールを読み込ませるには設定ファイルに「LoadModule dumpio_module modules/mod_dumpio.so
」と追加しておけばいいが、実際にダンプを開始させるには「 DumpIOInput On
」および「 DumpIOOutput On
」というディレクティブ指定も必要となる。このIOInputおよびIOOutputを有効化しておくと、Webサーバとクライアント間で交換されるすべてのトランザクションを取得でき、サーバ関連のトラブルシューティング時に役立つはずである。
Apacheにおけるその他のログ関連モジュール
その他のApacheモジュールの中にも、独自のログ記録用ディレクティブを有すものがいくつか存在している。例えばmod_rewriteでは RewriteLog
および RewriteLogLevel
というディレクティブを利用できるが、リライトに関するディレクティブが期待通りの動作をしなかった場合は、こうしたリライトログを取ることがトラブルシューティングに役立つことがある。
CGIスクリプト関連のエラーは、 ScriptLog
、 ScriptLogBuffer
、 ScriptLogLength
によってログを記録できるが、その際には、スクリプト用のログファイルをApacheの実行ユーザに対して書き込み可能にしておかなくてはならない。このうちScriptLogが捕捉するのは、CGIスクリプトが標準出力および標準エラーに書き出すリクエストのヘッダとテキストである。
本稿で解説したログ記録用ディレクティブの大半は、実際に使用するとサーバのパフォーマンスを悪化させディスクスペースの消費量を高めることになるので、その利用はトラブルシューティング目的のみに限定するべきである。ログ記録の実行には慎重を期する必要があり、プロダクションサーバ(実運用サーバ)で長期間使用し続けることは奨励できない。とはいうもののApacheのログ機能は、使い方さえ誤らなければ、トラブルシューティング時の強力なツールとして活用できるはずだ。
Murthy Rajuは、インドのRishi Valley Schoolにてコンピュータサイエンスを教えるかたわら、Linuxベースの小規模なコンピュータネットワークも管理している。またシステム/ネットワーク管理者およびテクニカルサポートとして、Linux、Unix、Windowsプラットフォームで使用する各種のオープンソースおよび商用製品を扱ってきた7年間の経験も有す。