syslog转发日志失败原因分析

syslog客户端发送日志消息至syslog服务端,服务端无法正常接收客户端上报的日志消息。并且,syslog客户端及服务端的配置无任何异常。导致失败的原因、问题分析的过程以及解决办法记录如下。

1.问题再现

syslog客户端的ip为192.168.10.186,syslog服务端的ip为192.168.10.12。

(1)syslog客户端的转发规则配置如下:

即,将user.*级别的日志消息通过udp协议转发给服务器192.168.10.12的514端口上。

(2)syslog服务端接收日志的配置条目如下:

即,将user.*级别的日志消息存储到文件/var/log/test.log中。

(3)测试代码如下

编译、运行,将会产生一条syslog日志,正常情况下,syslog服务器(192.168.10.12)的test.log文件中将会存储该条日志消息。

查看test.log文件,并未产生日志消息。

2.问题分析

查看客户端和服务端的配置文件均无异常,那么,是什么原因导致test.log中未产生日志消息的呢?

先从两个方面来考虑:客户端压根就没有发送出去日志消息?或者客户端其实已经发出日志消息,但是服务端并没有接收到?

判断客户端是否发送syslog日志消息,使用抓包工具抓包分析:

第一步,打开wireshark抓包工具,过滤条件设置为syslog协议(或者在linux中使用tcpdump工具抓包);

第二步,运行测试程序syslog_test,产生一条syslog日志消息;

第三步,观察抓包情况:syslog协议报文

其中,第一条报文表明,源主机192.168.10.186向目的主机192.168.10.12通过syslog协议发送来一条内容为“Mar 30 08:59:59 AIO3-1 syslog_test[27077]: The pid of syslog_test=27077”的syslog日志消息;第二条是一个ICMP报文,表明上一条报文目的未达到。

因此,排除第一种可能。那么问题导向第二种情况——syslog服务器未接收到日志消息,初步判断是被阻断了。

3.解决方法

那么,是什么阻断了syslog消息呢?防火墙?尝试如下操作:

(1)关闭syslog服务器(主机12)的防火墙服务:

(2)主机186再次运行测试程序: ./syslog_test

(3)主机12查看test.log文件的内容:

ok,果然是被防火墙阻断了。问题解决。

4.其它

上述解决方法是直接将防火墙关闭,这种方法不值得提倡,更好的做法是配置防火墙规则,不阻断514端口的报文,配置如下(增加第11行的规则):

重启防火墙,客户端发送syslog日志,服务端正常接收。

发表评论

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