一、需求
负责网络的同事在搞日志集中应用,由于涉及的网络厂商有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.comwhile 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 />