systemd-journald 是系统日志实现吗?

seb*_*elk 29 syslog systemd-journald

我想知道 systemd-journald 是一种新的 syslog 协议实现,或者更确切地说,它使用了 syslog 实现,例如 rsyslog、syslog-ng

我用谷歌搜索了一下,但我没有发现任何令人信服的内容。

Jde*_*eBP 40

就协议而言,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-only 协议,在每个数据报中包含一个键=值对数组,以及可选的可读文件描述符.

syslog()GNU C 库中的函数所说的协议既不是 RFC 5424 也不是 RFC 3164,实际上是它自己的事实上的标准。它不是 RFC 5424,因为它没有正确数量的空格和用 NIL 值指定可选字段的破折号。它不是 RFC 3164,因为它有一个PROCID字段而不是HOSTNAME.

几年前,您的 systemd 操作系统将具有:

  • systemd-journald完成上述所有工作(以及一些与协议无关的事情),并成为 GNU C 库和 systemd C 库使用各自协议进行通信的服务器
  • 一个可选的系统日志或rsyslog现在或syslog-ng的程序调用,要么xinetd/inetd风格的东西时尝试消息发送到/run/systemd/journal/syslog和接收插座作为一个开放的文件描述符,或作为配置为在打开的直服务并侦听/run/systemd/journal/syslog与它的(等效的rsyslog)imuxsock模块;并说 GNU C 库协议
  • 可选的 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 流量

进一步阅读