Linux

Linux 的 rsyslog 是否支持 RFC 5424?

  • December 8, 2021

由於某種原因,rsyslogd似乎無法正確解釋有效RFC 5424消息。甚至 RFC 給出的範例也不起作用:

$ echo "<165>1 2003-08-24T05:14:15.000003-07:00 192.0.2.1 myproc 8710 - - %% It's time to make the do-nuts." | nc -w1 -Uu /dev/log

導致日誌行:

Dec  1 16:39:08 host 1 2003-08-24T05:14:15.000003-07:00 192.0.2.1 myproc 8710 - - %% It's time to make the do-nuts.

這表明消息無法正確解釋為RFC 5424消息,而是將整個字元串視為消息有效負載。

另一方面,舊RFC 3164格式可以毫無問題地接受:

$ echo "<165>Dec  1 05:14:15 myproc[8710]: %% It's time to make the do-nuts."| nc -w1 -Uu /dev/log

導致正確的日誌行:

Dec  1 16:44:31 host myproc[8710]: %% It's time to make the do-nuts.

在網際網路上探勘我找不到任何關於rsyslog方面缺乏支持的提及。難道我做錯了什麼?

我正在執行 Linux Mint 20。rsyslogd版本是8.2001.0 (aka 2020.01)

在消息內容到達rsyslog之前以某種方式修改消息內容可能是****systemd的錯嗎?

有同樣的問題,最後通過將其添加到我的 rsyslog.conf 找到了解決方案:

input(type="imuxsock" socket="/dev/log" useSpecialParser="off")

useSpecialParser 參數指示 imuxsock 輸入模組對消息使用正常解析器,而不是無法解析 RFC5424 格式的特殊解析器。參照。https://rsyslog-doc.readthedocs.io/en/latest/configuration/modules/imuxsock.html

請注意,對於 udp 或 tcp 等其他輸入模組,始終正確解析 RFC5424。

這種情況在這裡得到了很好的介紹:Confused with syslog message format

TL;博士:

  • 大多數 *nix 記錄器使用 RFC 3164。
  • 但是,rsyslogd 將允許您配置 RFC 5424 格式

這是討論如何的許多文章之一:

生成特定於 RFC 5424 的 Syslog

預設情況下,Syslog 是根據 RFC 3164 生成的。要以結構化格式在每個 Syslog 中提供最大量的資訊,您可以啟用特定於 RFC 5424 的 Syslog 日誌記錄。

符合 RFC 5424 的 Syslog 具有增強的 Syslog 標頭,有助於辨識 Syslog 的類型、過濾 Syslog 消息、辨識 Syslog 生成時間(相對於時區的年份和毫秒)以及其他增強功能。可以使用該logging enable rfc5424命令啟用特定於 RFC 5424 的 Syslog。在啟用特定於 RFC 5424 的 Syslog 之前,必須清除日誌緩衝區,否則係統會顯示錯誤。


根據 OP:

我的問題是關於客戶端和 rsyslog 服務之間的通信協議

我沒有使用 libc 的庫函式 syslog()… 我使用 nc 將數據報直接發送到 /dev/log

在這種情況下,解決方案似乎是以標準 RFC 3164 格式發送數據報。

一種遠射的可能性:

https://www.rsyslog.com/doc/master/concepts/messageparser.html

消息解析器是 rsyslog 5.3.4 及更高版本的一個特性。

$$ They $$是 rsyslog 的組件,用於在接收到 syslog 消息後對其進行解析。在 rsyslog 5.3.4 之前,消息解析器內置於 rsyslog 核心本身並且無法修改(除了修改 rsyslog 程式碼)。 在 5.3.4 中,我們改變了這一點:消息解析器現在是可載入的模組(就像輸入和輸出模組一樣)。這意味著可以在不修改 rsyslog 核心的情況下添加新的消息解析器,甚至無需對項目做出貢獻。

引用自:https://unix.stackexchange.com/questions/622801