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); };

これで、ホスト名でフィルターが実現できました。

参考

3.6 Filters

環境

$ rpm -qa | grep syslog-ng
syslog-ng-3.0.2-1.rhel5
$ cat /etc/redhat-release 
CentOS release 5 (Final)