syslog-ng通过IP过滤日志

一、需求

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

二、需求分析

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



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



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

三、syslog-ng配置和脚本

syslog-ng配置如下:



<br />
//本机日志服务器监听的端口
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进行的过滤。当然其也可以网段来进行匹配,比如:



<br />
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是处理的脚本,其内容如下:



<br />
#!/bin/bash
# code by www.361way.com 
while read LINE
do
  echo $LINE|awk '{$4=""; print $0}'  >>/var/adm/test.log
done
以上脚本每接收到一行数据,就将第四列去掉,并写到新的日志文件里去。当然想入库也比较简单,在do循环体内加入mysql 入库的语句即可,其内容如下:



<br />

<

pre class=”prettyprint linenums lang-bsh”>mysql -u${MYSQL_USER} -p${MYSQL_PASSWD} -h${MYSQL_ADDRESS} <根据自己需求,将上面的数据库入库语句修改下就行了。 启动syslog-ng时,其会自动fork调用刚刚的脚本,见下图: <img src="https://www.361way.com/wp-content/uploads/2018/03/syslog-ng_program.png" width="885" height="67" title="syslog-ng_program" alt="syslog-ng_program" /> 另外destination可以指定多个,如下: <br />

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



<br />

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注