Linux 的 rsyslog 是否支持 RFC 5424?
由於某種原因,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 格式
這是討論如何的許多文章之一:
預設情況下,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 核心的情況下添加新的消息解析器,甚至無需對項目做出貢獻。