中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

アパッチ・モジュールのログTips - CustomLog編

今回のお題はアパッチのCustomLogです。

前回は分量が多過ぎて力尽きたので今回からは少なめで・・・

アパッチのログ機構

アパッチは二系統(3種)のログ機構を持っています。

ErrorLog
ログレベルによる出力制御が可能なログ。
CustomLog
リクエスト毎に出力されるログ。所謂アクセスログです。出力項目をhttpd.confから制御可能。
実はSetEnvIfと組み合わせて条件付きで出力も出来なくはありませんが、ココでは説明しません。

  TransferLogはCustomLogの一種です。*1


他にも各モジュールで独自にログ機構を提供している場合もあります。
ですがやはりココでは解説しません。
有名なものはこの辺でしょうか。。

RewriteLog
mod_rewriteデバッグ
ScriptLog
mod_cgiデバッグ

モジュール開発に関係するのは主にErrorLogです。

CustomLog

CustomLogはアパッチがレスポンスを返すタイミングで出力されます。
このタイミングを制御するコトは出来ません。

出力内容はLogFormatディレクティブで定義できます。
出力可能な項目はアパッチがリクエスト毎に保持している様々な変数です。
これらの変数は各モジュールから設定する事も可能です。


またCustomLogは1リクエスト毎に何ファイル(別フォーマット)でも出力できます。(当然性能に影響しますが・・・)

httpd.confの設定例

# 1セット目
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
# 2セット目
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_detail_log combind

LogFormatの設定は本家の方を参照してください。

CustomLogに関しては単体で説明する事が難しいのでこの位にしておきます。
今後モジュールの解説が進んだ時にまた触れるかもしれません。

モジュールからCustomLogへ出力

最後にモジュールから環境変数を設定する(CustomLogに出力する)例だけ載せておきます。


httpd.confの設定。

"%{Foo}n"
アパッチのメモ領域にある"Foo"というキーの値を出力。
# notes "Foo"を出力
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Foo}n\"" common
CustomLog logs/access_log common


モジュールソースを抜粋

apr_table_set
アパッチモジュールではハッシュ領域(key=>valueのリスト)をtableと呼びます。
ここではリクエストコンテキスト内のメモ領域(notes)に値をセットしています。
// ハンドラ
static int mytest_handler(request_rec *r)
{
     :
    // request_rec::notesにキー"Foo":バリュー"Bar"を設定
    apr_table_set(r->notes, "Foo", "Bar");
     :
    return OK;
}


出力結果("Bar"が出力されている)

10.77.8.128 - - [05/Jan/2009:18:41:09 +0900] "GET /mytest/ HTTP/1.1" 200 16 "Bar"


見ての通りCustomLogへの出力自体は難しい訳ではありません。
が、ちょっと凝った事をやろうとするとアパッチ全体の動作(各種ハンドラのタイミング等)が絡んできて厄介な事になりがちなので、最初の内は次回解説するErrorLogだけを相手にしていた方が良いでしょう。


という訳で次回のお題はErrorLogの予定です。

*1: カスタマイズ出来ないCustomLog。デフォルトのCustomLogと言っても良い