syslog-ng通过IP过滤日志
一、需求
负责网络的同事在搞日志集中应用,由于涉及的网络厂商有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调用刚刚的脚本,见下图:
另外destination可以指定多个,如下:
1destination d_prog{ program("/usr/local/bin/logcheck.sh" ); file(”/var/log/auth.log”);};
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/syslog-ng-filter-sourceip/5670.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.