syslog-ngのログ集約時にホスト名でフィルターする方法
以下のような、サーバ構成でWebサーバのログを収集したいと考えたとします。
デプロイなどの関係上、設定ファイル(configファイル)はサーバごとに変更したくないという場合があります。
同じ、local6.info でログサーバに投げるため、通常ログサーバ側では同じログファイルに保存されますが、ホスト名などでフィルターをかければログファイルを分けることができます。それをやってみます。
転送元サーバの /opt/syslog-ng/etc/syslog-ng.conf (ホスト名:web-a、web-bともに同じです)
/opt/syslog-ng/etc/syslog-ng.conf
source s_local { file ("/proc/kmsg" program_override("kernel: ")); unix-stream("/dev/log"); internal(); }; destination d_loghost { tcp("loghost");}; filter f_lighttpd_log { facility(local6) and level(info); }; log { source(s_local); filter(f_lighttpd_log); destination(d_loghost); };
/etc/hosts
192.168.0.3 loghost
フィルター実装前のログサーバの /opt/syslog-ng/etc/syslog-ng.conf
/opt/syslog-ng/etc/syslog-ng.conf
source s_local { file ("/proc/kmsg" program_override("kernel: ")); unix-stream("/dev/log"); internal(); tcp(); }; destination d_lighttpd_log { file("/var/log/access.log"); }; filter f_lighttpd_log { facility(local6) and level(info); }; log { source(s_local); filter(f_lighttpd_log); destination(d_lighttpd_log); };
フィルター実装後のログサーバの /opt/syslog-ng/etc/syslog-ng.conf
/opt/syslog-ng/etc/syslog-ng.conf
source s_local { file ("/proc/kmsg" program_override("kernel: ")); unix-stream("/dev/log"); internal(); tcp(); }; destination d_lighttpd_log_web-a { file("/var/log/web-a/access.log"); }; destination d_lighttpd_log_web-b { file("/var/log/web-b/access.log"); }; filter f_lighttpd_log_web-a { facility(local6) and level(info) and host(web-a); }; filter f_lighttpd_log_web-b { facility(local6) and level(info) and host(web-b); }; log { source(s_local); filter(f_lighttpd_log_web-a); destination(d_lighttpd_log_web-a); }; log { source(s_local); filter(f_lighttpd_log_web-b); destination(d_lighttpd_log_web-b); };
名前解決とIP直の指定
フィルターのホスト名の部分ですが、このホスト名は 名前解決できないと認識できないようなので、ログサーバの /etc/hostsに以下を加えます。
/etc/hosts
192.168.0.1 web-a 192.168.0.2 web-b
もし、名前解決が面倒であれば、IPで指定しても大丈夫です。
filter f_lighttpd_log_web-a { facility(local6) and level(info) and host(192.168.0.1); }; filter f_lighttpd_log_web-b { facility(local6) and level(info) and host(192.168.0.2); };
これで、ホスト名でフィルターが実現できました。
参考
環境
$ rpm -qa | grep syslog-ng syslog-ng-3.0.2-1.rhel5 $ cat /etc/redhat-release CentOS release 5 (Final)