一、需求

负责网络的同事在搞日志集中应用,由于涉及的网络厂商有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配置如下:

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

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

1filter f_test { (netmask(192.168.8.100/32)) and
2          (message("Client IP: 10.1.1.*") or
3            message("Client IP: 10.10.10.*"))
4};

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

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

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

1mysql -u${MYSQL_USER} -p${MYSQL_PASSWD} -h${MYSQL_ADDRESS} `<eof eof="" insert="" into="" test_table="" testdb="" use="" values="">`

根据自己需求,将上面的数据库入库语句修改下就行了。启动syslog-ng时,其会自动fork调用刚刚的脚本,见下图:

syslog-ng_program
syslog-ng_program

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

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