Rsyslog
為什麼 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/failover
上demo
包含: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 虛擬機上都遇到了這個問題。
補充筆記:
- 網路連接看起來不錯。如果我嘗試在日誌消息未發送到日誌伺服器期間,兩者
ping 192.168.1.20
都成功。curl google.com``ping``curl
- 禁用日誌伺服器的防火牆無效。
- 執行
tcpdump
顯示在 20 秒期間沒有任何內容髮送到日誌伺服器。- 網路上的其他 Ubuntu 機器(使用非常不同的方法部署)將它們的日誌報告給日誌伺服器,包括在引導期間。
- 通過將故障機器與正確機器進行比較,我注意到
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 ]
diff
表明新故障機器/etc/rsyslog.conf
和/etc/rsyslog.d/*.conf
舊機器之間的文件完全相同。- A
apt-get update
,apt-get upgrade
甚至apt-get dist-upgrade
還沒有解決問題。
正如@ThomasDickey 所說,當使用者態程序開始執行時,網路可能還沒有完全啟動。許多企業乙太網交換機在介面出現後的數秒內不接受數據包,因為它們試圖協商生成樹設置。
rsyslog的actionresumeinterval設置預設為 30 秒。如果在任何使用 TCP 連接的指令之前將其設置為較小的值,則會增加重試率,並且連接應該更快地完成。
您還可以設置其他選項,以確保在連接準備好後立即發送未發送的早期消息。例如,您可以使用類似於以下的選項:
$ActionResumeInterval 5 $ActionQueueType disk $WorkDirectory /var/spool/rsyslog $ActionQueueFilename actionRq $ActionQueueMaxDiskSpace 1m $ActionQueueSize 4000 $ActionQueueTimeoutEnqueue 0 $ActionResumeRetryCount -1