进一步阅读

进一步阅读

我想知道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/syslogimuxsock
  • 可选的 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 流量

进一步阅读

相关内容