apacheのmoduleを作る時に、ログ出力の為に ap_log_rerror() 関数を使いますが、
引数が多くてメンドクサイので以下のようなマクロを作って使っている例が良くあります。
#define DEBUGLOG(...) ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, MODULE_NAME ": " __VA_ARGS__)
~何かの処理~
DEBUGLOG("Log output : %s", messages);
~処理続き~
これはこれで便利なんですが、
「このマクロで出すlogはデバッグでよい」
って事で、
#define DEBUGLOG(...) ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, MODULE_NAME ": " __VA_ARGS__)
と、APLOG_DEBUGレベルにすると、httpd.confで「LogLevel debug」を指定しても一向にログファイルに出てこない…なんて経験ありませんか?
これ、実はソースを読んで行くと、 ap_log_error() 関数の第5引数って、本当だったら server_rec* を入れるべきなんですね。
でも、server_rec* ってhandlerとかに来るので、config関係の中とかには出てこないし、
handler内でもちょっとしたロジックサブルーチンの中にまでserver_rec*を引き回すのは面倒だったりしますよね。
(かといってmodule globalの変数に入れるとオチるし…(当たり前))
この第5引数が0の時の挙動って、「stderrエラーログへ出力する」って言うロジックに落ちてまして、
その中でログレベルがNOTICE以上か?って判定入ってたりします。
なので、第5引数に0を入れた場合は第3引数にAPLOG_NOTICE以上を設定しないと永久に吐かれないLOGを実装していることになります。
なので、デバッグログを出したい時は、server_rec*、request_rec*が来ている所でap_log_error()、ap_log_rerror()を使わないとダメなようです。
若しくは、マクロで
#define DEBUGLOG(...) ap_log_error(APLOG_MARK, APLOG_DEBUG, s, NULL, MODULE_NAME ": " __VA_ARGS__)
みたいに決め打ちしてしまって、実際の関数の中で「server_rec* の名前は必ずr」とルール決めて書くしかないですね。
(他に良い手段あったら教えてほしいです…。)
そんなわけで、「module内でどこでも気軽にlog出したい!」と考えている人はAPLOG_NOTICE以上を設定するようにしてください…。
※ ちなみに、文中で「0は第5引数」と書いてありますがこれは間違いではありません。第一引数に指定されているAPLOG_MARKは「file,line」と定義されているマクロなので、これ1個で2つ分の引数になります。