syslog-ng通过IP过滤日志

2018年3月30日 发表评论 阅读评论

一、需求

负责网络的同事在搞日志集中应用,由于涉及的网络厂商有CISCO、华为、H3C、F5等,其中思科的日志格式和其他厂商的不一样,在入库并loganalyzer展示时发现部分字段有错位的问题。所以其需求是想在入库前对部分IP的网络设备的日志做整形后再入库。这里就结合下syslog-ng的过滤器功能实现下。

二、需求分析

在syslog-ng配置里,有三个比较重要的概念,监听源(source)、过滤器(filter)、和目标存(destination):

  • source指定本台日志服务器监听的IP,比如该机有多个IP,可以指定只监控内网IP,也可以通过system 和 internal 函数指定本机日志。这个要特别注意,这个source并不是远程网络设备的IP
  • 过滤器是个特别重要的角色,可以通过f_auth、f_kernel、f_cron和info、crit 这种配合分离出不同类型的日志,也可以通过源IP(远程主机或设备的IP,即日志发送方),关键字等进行过滤;
  • 目标存这个名发是我自取的,其作用是将source端听收到的数据,经过过滤器处理后,要存放的地方。这个存方的地方不一定是文件名,也可以是程序、管道、其他数据库等。

通过上面三者的功能介绍,其需求已经非常了然了。需要做的就是在过滤器里进行源IP匹配,并在保存的时候交给program处理并入库就行了。

三、syslog-ng配置和脚本

syslog-ng配置如下:

//本机日志服务器监听的端口
source s_remote {
        tcp(ip(0.0.0.0) port(514));
        udp(ip(0.0.0.0) port(514));
};
filter f_netdev { host("10.125.100.1") or
                  host("200.200.14.47"); };
destination d_prog{ program("/usr/local/bin/logcheck.sh" );};
log { source(s_remote); filter(f_netdev);  destination(d_prog); };

其中f_netdev项中的host即是根据IP进行的过滤。当然其也可以网段来进行匹配,比如:

filter f_test { (netmask(192.168.8.100/32)) and
                    (message("Client IP: 10\.1\.1\.*") or
                     message("Client IP: 10\.10\.10\.*"))
};

/usr/local/bin/logcheck.sh是处理的脚本,其内容如下:

#!/bin/bash
# code by www.361way.com <itybku@139.com>
while read LINE
do
  echo $LINE|awk '{$4=""; print $0}'  >>/var/adm/test.log
done

以上脚本每接收到一行数据,就将第四列去掉,并写到新的日志文件里去。当然想入库也比较简单,在do循环体内加入mysql 入库的语句即可,其内容如下:

mysql -u${MYSQL_USER} -p${MYSQL_PASSWD} -h${MYSQL_ADDRESS} <<EOF
use testdb;
insert into test_table(col1,col2,col3) values('${value1}',value2,value3);
EOF

根据自己需求,将上面的数据库入库语句修改下就行了。

启动syslog-ng时,其会自动fork调用刚刚的脚本,见下图:

syslog-ng_program

另外destination可以指定多个,如下:

destination d_prog{ program("/usr/local/bin/logcheck.sh" ); file(”/var/log/auth.log”);};




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: 开源软件 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.