我想知道systemd-journald是否是syslog协议的新实现,或者更确切地说,它使用syslog实现,例如rsyslog,syslog-ng
我用谷歌搜索了一下,但没有发现任何令人信服的内容。
答案1
就协议而言,systemd-journald
……
- ... 是名为 的流套接字上的侦听器
/run/systemd/journal/stdout
。 systemd 将服务的原始标准输出和错误(默认为或明确具有StandardOutput=journal
/StandardError=journal
)连接到此套接字。因此,它接收以换行符结尾的可变长度自由格式记录的协议。 - … 是名为 的数据报套接字上的侦听器
/run/systemd/journal/dev-log
,它从 进行符号链接/dev/log
。它接收syslog()
链接到应用程序的 GNU C 库中的库函数所说的协议。 - …尝试成为另一个服务的客户端,侦听名为 的数据报套接字
/run/systemd/journal/syslog
。这也接收syslog()
GNU C 库中的库函数所讲的协议(尽管systemd-journald
实际上使用另一个库和另一个函数来讲它)。 - ... 是来自名为 的字符设备的读取器
/dev/kmsg
。它接收 Linux 内核所使用的协议,该协议是可变长度、很大程度上自由格式、以换行符结尾的记录的协议。 - ... 是名为 的数据报套接字上的侦听器
/run/systemd/journal/socket
。这类似于 GNU C 库的情况,应用程序链接到一个库,该库与该套接字使用某种协议;除了该函数是 之外sd_journal_sendv()
,它位于应用程序链接到的 systemd C 库中,并且该协议不是标准化的,而是一个仅 systemd 的协议,在每个数据报中包含一个键=值对数组,以及可选的可读文件描述符。
GNU C 库中的函数所使用的协议syslog()
既不是 RFC 5424 也不是 RFC 3164,而是实际上它自己的事实上的标准。它不是 RFC 5424,因为它没有正确数量的空格和用 NIL 值指定可选字段的破折号。它不是 RFC 3164,因为它有一个PROCID
字段而不是HOSTNAME
.
几年前,您的 systemd 操作系统会有:
systemd-journald
执行上述所有操作(以及一些与协议)并成为 GNU C 库和 systemd C 库使用各自协议进行通信的服务器- 调用可选的 syslog 或 rsyslog 或 syslog-ng 程序,当某些东西尝试将消息发送到套接字并作为打开的文件描述符接收
xinetd
套接字时,或者作为配置为打开和侦听其的直接服务(相当于rsyslog)模块;并讲 GNU C 库协议inetd
/run/systemd/journal/syslog
/run/systemd/journal/syslog
imuxsock
- 可选的 syslog 或 rsyslog 或 syslog-ng 或 udp-syslog-read 服务侦听 RFC 5426 流量
如今,您的 systemd 操作系统具有:
systemd-journald
再次执行上述所有操作并成为 GNU C 库和 systemd C 库与之对话的服务器- 一个可选的 rsyslog 程序,作为直接服务而不是通过套接字调用,它使用其
imjournal
模块直接从 systemd 日志文件中读取内容 - 可选的 syslog 或 rsyslog 或 syslog-ng 或 udp-syslog-read 服务侦听 RFC 5426 流量