Apacheロギングの話
Hardening Apache という本があって、その本の第三章より抜粋した文書が以下リンクにある。Apacheのログについての話。
http://www.devshed.com/c/a/Apache/Logging-in-Apache/
探していた情報はなかったんだけど、Apacheのログに関してよくまとまっていて、良い本だなーと思った。でも日本語版はないっぽい。知らないだけのすごい良い本ってそれこそ星の数ほどあるんだろうなー。
ちなみに探していた情報というのは、ログのフィルタリングについて。取った後のログをフィルタリングしたいのではなくて、そもそも取りたくないログはどうしたら良いか、というもの。
アクセスログならば、
SetEnvIfNoCase REQUEST_URI "^/hoge" dontlog CustomLog logs/access_log common env=!dontlog
こんな感じでフィルタリングが出来る。大変お手軽でスバラシイ。
しかしながら、この手法によるフィルタリングはCustomLogでしか出来ない。ErrorLogでフィルタリングしたいとしたら?
ErrorLog "|/path/to/a/filter/and/log/utility"
こういう感じでフィルタリングしつつログが取れるプログラムに渡すしかない。
このフィルタリングしつつログを取るプログラムとして公開されているものを探していたんだけど、見つけられなかった。Apache付属のrotatelogsプログラムはパイプを使ったロギングの際に最もよく使われるもので、これにフィルタリングの機能を追加すれば実現は可能だな、ということまではわかっている。
未検証だけれど、Apache付属のrotatelogsプログラムと同様の機能を実装したPerlスクリプトはあって、この改造のほうが楽かなぁ。
http://englanders.cc/pub/linux/misc/rotatelogs.pl
さて、src/httpd-2.0.55/support/rotatelogs.cを眺めているんだけれど、
#include <regex.h> int main (int argc, const char * const argv[]) { int ret, nMatch; regex_t reg; rematch_t match[nMatch]; for (;;) { /* buf に STDINを読み込む処理は省略 */ regcomp(®, "regular expression", REG_EXTENDED); ret = regexec(®, buf, nMatch, match, 0); regfree(®); if (ret = 0) { continue; }; /* buf をファイルに吐くは省略 */ } }
こんな雰囲気で出来そうなんだけど、うまくいかない。Cプログラマじゃないのでロクにデバッグ出来ません。よくわかんないけど、src/httpd-2.0.55/srclib/pcre/pcre.h 使うべき?