syslog-ng

Apacheのログをsyslogで管理してみた

単一サーバ上でのテスト。

apacheのログのように、随時ファイルに追記されていくものを、syslogで管理できるようにする。

条件は、

apacheのアクセスログパス/www/logs/access_log
syslogとして記録するログファイル/var/log/httpd_access.log
ログのプライオリティlocal4.info

syslog-ngはそれ自体ではtail -fコマンドのようにファイルを追いかけてくれないため、下記スクリプトを用意して、起動しておく。

<httpd_access_logger>
#!/bin/sh
tail -f /www/logs/access_log | logger -p local4.info
chmod +x httpd_access_logger
./httpd_access_logger &

次に、syslog-ng.confに下記設定を追記。

filter f_httpd         { facility(local4) and level(info); };
destination d_httpd    { file("/var/log/httpd_access.log"); };
log { source(src);      filter(f_httpd);     destination(d_httpd); };

これで、Webサーバにアクセスしてみると、/var/log/httpd_access.logにどんどん追記されていく。 ただし、/www/logs/access_logも当然太っていく。 無駄の多い処理だ。

また、ひとつのログファイルにつきひとつのバックグランドプロセスが必要になるので、スマートではない。

また、Webサービスを停止して、ログを削除して、Webサーバを起動すると、アクセスログが再度生成されるが、tailコマンドはそいつは当然追いかけてくれない。 Webサーバの再起動とログローテーションなんかをやっている場合には、上記の方法はそのままでは使えない。 Webサービスの再起動などの際には、loggerプロセスもちゃんと再起動させてあげる必要がある。

なんにしても、あまりいい方法とは思えない。

ちなみに上記の方法は、syslog-ngの付属ドキュメントに書かれてあった。

あと、エラーログだけだったら、上記のようにtailで追いかけなくても、httpd.confに、

ErrorLog syslog:local2

などとすれば、syslogに吐いてくれる。

で、いろいろ試してたら、下記のようにすれば、アクセスログもsyslogに出力できる。

CustomLog "|logger -p local3.info" common

これを応用すれば、分散配置しているWebサーバのアクセスログをloghostに集約できる。 ホスト別に収集するもよし、負荷分散装置配下の並列Webサーバであれば、統一したアクセスログとして収集することもできる。 受け側のsyslog-ng.confを設定することで、ホストの区別も付けられないこともない。 ああ便利。

まあ、UDPなんで、高負荷なWebサーバではログの取りこぼしが問題になってくるのかも知れない。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS