这部分详细讲讲syslog-ng服务器上的配置。
一、配置关系图
(加入知识星球“企业Splunk实践”查看高清大图)
二、配置说明
1、syslog-ng.conf配置
@include "/etc/syslog-ng/patterndb.d/"
可以在主配置文件里包含其它路径下的配置,这样有利于配置维护。在这里我们包含了/etc/syslog-ng/patterndb.d/路径下的配置文件。
这里可以看到我们在路径下有4个配置文件:
F_nginx:接收nginx日志的配置文件;
L_linux:接收linux日志的配置文件;
Y_local:用来接收本机日志的配置文件;
Z_all:用来接收所有其它syslog日志的配置文件;
注意:在这里的配置文件的生效顺序依据文件名首字母大小写顺序,具体的规则查看syslog-ng-ose-guide-admin 5.6.1节。
sources_tcp_1515 { tcp(ip(0.0.0.0) port(1515) so_rcvbuf(805306368) so_sndbuf(8096) time_zone(GMT) keep_timestamp(yes) max-connections(5000) );};
这里我们建立了一个tcp/1515端口的源,用来接收其它IP发送到这个端口的日志。涉及的参数有很多,具体内容查看syslog-ng-ose-guide-admin 6.5节;
2、Nginx日志配置文件
templatet_nginx { template("${MSG}\n");};destination d_nginx { file("/mydata/syslog/NGINX/$SOURCEIP/$YEAR-$MONTH-$DAY.log" template(t_nginx) perm(0755) dir_perm(0755) create_dirs(yes));};filter f_nginx { netmask(10.100.18.247/255.255.255.255); # match("nginx_access:" value("MSGHDR")); program("nginx_access");};log { source(s_tcp_1515);filter(f_nginx); destination(d_nginx);};
log配置简单理解:来自source的日志,如果匹配了filter,将会发往destination。
我们在《Splunk:使用syslog-ng和HF(UF)收集syslog日志(二)》文中将Nginx、Linux日志都发到了tcp/1515端口,但是只有匹配了filter(f_nginx)的日志,才会发往destination(d_nginx)。
我们继续看看filter的配置:
_filter f_nginx {
netmask(10.100.18.247/255.255.255.255);
# match("nginx_access:" value("MSGHDR"));
program("nginx_access");
};
_netmask指定了源IP地址是10.100.18.247;
program指定了syslog的program为nginx_access;我们怎么知道是nginx_access呢,这点在《Splunk:使用syslog-ng和HF(UF)收集syslog日志(二)》文中,我们在nginx.conf配置文件里定义了tag=nginx_access。关于tag、program具体信息,大家可以看看syslog有关的RFC协议里有详细的介绍。
templatet_nginx {
template("${MSG}\n");
};
template配置设定了日志的存储格式,这里只有一个字段MSG,就和我们在《Splunk:使用syslog-ng和HF(UF)收集syslog日志(二)》文中rsyslog配置部分nginx配置%msg%一样,也和我们在nginx.conf配置文件里定义的log_format一样。
在《Splunk:使用syslog-ng和HF(UF)收集syslog日志(二)》文中我们留了一个问题,现在我们看看。
rsyslog中nginx日志格式配置如下:
template(name="T_nginxaccess_remote" type="string" string="%syslogtag%%msg%\n")
syslog-ng中nginx日志格式配置如下:
templatet_nginx {
template("${MSG}\n");
};
可以看到在rsyslog上和syslog-ng上,定义的日志格式并不一样,但是最终在Nginx服务器和syslog-ng服务器,保存的nginx最终日志格式都是一样的:
在通过rsyslog将nginx日志发到syslog-ng服务器时,我们定义的template
template(name="T_nginxaccess_remote" type="string" string="%syslogtag%%msg%\n")
也就是将_%syslogtag%_一并发到syslog-ng服务器,然后我们在syslog-ng的filter配置里:
filter f_nginx {
netmask(10.100.18.247/255.255.255.255);
# match("nginx_access:" value("MSGHDR"));
program("nginx_access");
};
才可以使用_program("nginx_access");将nginx日志过滤出来,最终记录的日志格式仍然是
templatet_nginx {
template("${MSG}\n");
};
和我们在nginx服务器上定义的格式一致了。
如果我们在rsyslog配置的时候,不将%syslogtag%_传送过来,我们在syslog-ng服务器上,就无法使用tag相关参数的过滤规则。大家可以自己配置试试,如果不配置%syslogtag%,记录的日志格式会是什么样。
这里再留一个问题,syslog的tag和program有什么关系?
3、Linux日志配置文件
templatet_linux { template("timestamp=\"${STAMP}\",dest_ip=\"${SOURCEIP}\",devicetype=\"Linux\",facility=\"${FACILITY}\",severity=\"${LEVEL}\",program=\"${PROGRAM}\",syslogtag=\"${MSGHDR}\",msg=${MSG}\n");};destination d_linux { file("/mydata/syslog/LINUX/$SOURCEIP/$YEAR-$MONTH-$DAY.log" template(t_linux) perm(0755) dir_perm(0755) create_dirs(yes));};filter f_linux { not (filter(f_nginx));};log { source(s_tcp_1515); filter(f_linux); destination(d_linux);};
log配置简单理解:来自source的日志,如果匹配了filter,将会发往destination。
这里的filter是f_linux,内容是不匹配f_nginx的日志,所以从这里可以看出为什么我们在创建配置文件时要考虑文件命名。
templatet_linux {
template("timestamp=\"${STAMP}\",dest_ip=\"${SOURCEIP}\",devicetype=\"Linux\",facility=\"${FACILITY}\",severity=\"${LEVEL}\",program=\"${PROGRAM}\",syslogta
g=\"${MSGHDR}\",msg=${MSG}\n");
};
日志格式定义,这里使用了key:value的形式,便于后续splunk采集日之后自动解析字段。
三、参考资料
The syslog-ng Open Source Edition 3.12 Administrator Guide
https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/
rsyslog 8.30.0 documentation
http://www.rsyslog.com/doc/v8-stable/index.html
syslog相关RFC规范
加入星球查看更多内容: