通过 TCP 从 rsyslog 转发到 syslog-ng 不起作用(尽管数据包正在到达服务器)

通过 TCP 从 rsyslog 转发到 syslog-ng 不起作用(尽管数据包正在到达服务器)

我们在中央 syslog 服务器上使用 syslog-ng(CentOS 5.9 上的 syslog-ng-2.1.4-9.el5)。我们一直很高兴地使用 syslogd 和 rsyslog 通过 UDP 从 Linux 和 Solaris 主机混合发送日志,直到昨天我终于发现我们丢失了大量条目(是的,我应该注意到所有警告)。

我正在尝试改用 TCP。我(目前)热衷于在中心使用 syslog-ng,在发送方使用 rsyslog,我的理解是这应该可行。中央 syslog 服务器有多个虚拟接口,用于按功能划分日志集(这就是为什么 udp() 和 tcp() 语句指定要绑定的 IP 地址的原因)。

我在 syslog-ng 端启用了 TCP 侦听器(请参阅下面配置文件的摘录)- netstat -l 显示端口 514 上的侦听器。作为测试,我将一台主机(带有 rsyslog-5.8.10-6.el6.x86_64 的 CentOS 6.4)上的转发子句从 @unixlog 更改为 @@unixlog。我看到数据包到达中央服务器,数据包返回(使用 unixlog 上的 tcpdump 查看),所以我认为我已经消除了 iptables 的问题,但是输出文件中没有出现任何内容。我刚刚尝试关闭 iptables 一段时间来检查这一点 - 还是一样。

我还没有尝试打开 syslog-ng 的调试功能,因为这是一个繁忙的服务器 - 我的下一步可能是设置一个测试 syslog-ng 服务器并将单个主机指向它。在此之前,我还应该考虑其他什么吗?我需要更改转发消息的格式吗?我阅读了 Syslog-ng 2.x 文档,发现这应该可以正常工作,无需任何更改。我尝试更改调用 rsyslog 的兼容级别选项。最初设置为 5,我尝试过 0 .. 4 并完全删除该参数 - 行为没有区别。

发送方的 Rsyslog.conf(已删除注释和本地文件)…

$ModLoad imuxsock
$ModLoad imklog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
*.err;kern.debug;daemon.notice;mail.crit                @unixlog.ncl.ac.uk
local3.debug                                            @cmdloghost.ncl.ac.uk

从 unixlog 上的 rsyslog.conf 中提取

options {
  long_hostnames(off);
  sync(0);
  create_dirs(yes);
};

destination d_syslog {
  file("/var/log/incoming/syslogs/$HOST/syslog.$YEAR$MONTH$DAY.log");
};

# unixlog is 10.8.232.202
source unixlog_net { udp(ip(10.8.232.202)); tcp(ip(10.8.232.202)); };

log {
  source(unixlog_net);
  destination(d_syslog);
};

答案1

问题出在 tcpwrappers 上,我设置了一个测试 syslog-ng 实例,并在打开调试输出的情况下运行它,结果就很明显了。在 /etc/hosts.allow 中添加以下子句就可以解决问题

syslog-ng: 10.0.0.0/255.0.0.0

还意识到我们没有处理 syslog-ng 的内部消息(这很可能告诉我们问题所在)。现在已添加以下几行来执行此操作...

# Deal with syslog-ng's own messages
source s_internal { internal(); };
destination d_internal {file("/var/log/syslog-ng.log"); };
log { source(s_internal); destination(d_internal); };

相关内容