![Linux 的 rsyslog 支持 RFC 5424 吗?](https://linux22.com/image/184343/Linux%20%E7%9A%84%20rsyslog%20%E6%94%AF%E6%8C%81%20RFC%205424%20%E5%90%97%EF%BC%9F.png)
因为某些原因,系统日志似乎无法正确解释有效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.
在互联网上挖掘,我找不到任何关于缺乏支持的提及系统日志边。难道我做错了什么?
我正在运行 Linux Mint 20。系统日志版本是8.2001.0 (aka 2020.01)
难道是因为系统即在消息内容到达之前以某种方式修改消息内容系统日志?
答案1
遇到了同样的问题,最终通过将其添加到我的 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 始终能够正确解析。
答案2
这里很好地描述了这种情况:与系统日志消息格式混淆。
长话短说:
- 大多数 *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 的系统日志。在启用特定于 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 及更高版本的一项功能。
[它们]是 rsyslog 的组件,用于在收到系统日志消息后对其进行解析。在 rsyslog 5.3.4 之前,消息解析器内置于 rsyslog 核心本身中,无法修改(除了修改 rsyslog 代码之外)。
在 5.3.4 中,我们更改了这一点:消息解析器现在是可加载模块(就像输入和输出模块一样)。这意味着可以添加新的消息解析器,而无需修改 rsyslog 核心,甚至无需为项目做出任何贡献。