为什么 syslogd 在启动期间和启动后不向远程服务器报告消息?

为什么 syslogd 在启动期间和启动后不向远程服务器报告消息?

我配置rsyslog为将日志发送到中央日志服务器,如下所示:

*.* @@192.168.1.20
$ActionExecOnlyWhenPreviousIsSuspended on
& @@192.168.1.21
& /var/log/failover
$ActionExecOnlyWhenPreviousIsSuspended off

它运行良好,除非机器正在启动。当虚拟机启动时以及计算机启动后大约二十秒,不会向 192.168.1.20 或 192.168.1.21 发送消息。然而,/var/log/failover包含所有那些“丢失”的消息。

作为测试,我启动了机器并手动输入:

$ logger 1
$ logger 2
$ logger 3
...

第一个中央日志服务器仅包含:

Nov 28 13:57:40 demo arsene: 10

第二个日志服务器不包含来自该demo计算机的消息。

最后,var/log/failoverdemo机器上包含:

Nov 28 13:57:10 demo rsyslogd: [origin software="rsyslogd" swVersion="7.4.4" x-pid="361" x-info="http://www.rsyslog.com"] start
Nov 28 13:57:10 demo rsyslogd: rsyslogd's groupid changed to 104
Nov 28 13:57:10 demo rsyslogd: rsyslogd's userid changed to 101
... # more than a hundred usual messages from the kernel
Nov 28 13:57:20 demo kernel: [   12.127981] random: nonblocking pool is initialized
Nov 28 13:57:21 demo arsene: 1
Nov 28 13:57:22 demo arsene: 2
Nov 28 13:57:23 demo arsene: 3
Nov 28 13:57:25 demo arsene: 4
Nov 28 13:57:27 demo arsene: 5
Nov 28 13:57:28 demo arsene: 6
Nov 28 13:57:30 demo arsene: 7
Nov 28 13:57:32 demo arsene: 8
Nov 28 13:57:37 demo arsene: 9

我在 Ubuntu 和 Debian 虚拟机上都遇到了这个问题。

补充笔记:

  1. 网络连接看起来很好。如果我尝试ping 192.168.1.20curl google.com日志消息未发送到日志服务器期间,两者ping都会curl成功。

  2. 禁用日志服务器的防火墙没有任何效果。

  3. 运行tcpdump显示在二十秒期间没有任何内容发送到日志服务器。

  4. 网络上的其他 Ubuntu 计算机(使用非常不同的方法部署)可以向日志服务器报告其日志,包括在启动期间。

  5. 通过将有故障的机器与正确的机器进行比较,我注意到rsyslogd.在有故障的机器上升级rsyslogd到版本 8.14.0 还没有解决问题,但现在我看到了以下消息日志报告开始工作:

    Nov 29 02:18:39 demo rsyslogd-2359: action 'action 11' resumed (module 'builtin:omfwd') [v8.14.0 try http://www.rsyslog.com/e/2359 ]
    
  6. diff表明新的故障机器和旧的工作机器之间的/etc/rsyslog.conf文件/etc/rsyslog.d/*.conf完全相同。

  7. A apt-get updateapt-get upgrade甚至还apt-get dist-upgrade没有解决问题。

答案1

正如@ThomasDickey所说,当用户态程序开始运行时,网络可能尚未完全启动。许多企业以太网交换机不接受以下数据包几秒接口出现后,它们尝试协商生成树设置。

rsyslog 有一个动作恢复间隔默认设置为 30 秒。如果在任何使用 TCP 连接的指令之前将其设置为较小的值,则会增加重试率,并且连接应该更快地完成。

还有其他选项您可以设置以确保在连接准备就绪后立即传送未立即发送的早期消息。例如,您可以使用以下选项如同:

$ActionResumeInterval 5
$ActionQueueType disk
$WorkDirectory /var/spool/rsyslog
$ActionQueueFilename actionRq
$ActionQueueMaxDiskSpace 1m
$ActionQueueSize 4000
$ActionQueueTimeoutEnqueue    0
$ActionResumeRetryCount -1

答案2

在那 20 秒内,网络可能还没有完全启动。在那之前,rsyslog没有人可以交谈,所以它是在本地编写的。

相关内容