Является ли systemd-journald реализацией системного журнала?

22

Интересно, является ли systemd-journald новой реализацией протокола syslog или, скорее, он использует реализации syslog, такие как rsyslog, syslog-ng

Я немного погуглил, но не нашел в этом ничего убедительного.

sebelk
источник
Возможно, вы захотите уточнить, если под «протоколом syslog» вы подразумеваете получение syslog по tcp | udp 514 или отправку, или и то, и другое.
Алекс Стрэджи
также см. возможный обман: unix.stackexchange.com/questions/83173/…
Алекс Стрэджи

Ответы:

33

Что касается протоколов, 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, содержащим массив пар ключ = значение и, необязательно, читаемый файловый дескриптор в каждой дейтаграмме ,

Протокол, используемый syslog()функцией в библиотеке GNU C, не является ни RFC 5424, ни RFC 3164, а фактически является собственным стандартом де-факто. Это не RFC 5424, потому что он не имеет правильного количества пробелов и черточек, обозначающих необязательные поля со значениями NIL. Это не RFC 3164, потому что у него есть PROCIDполе вместо HOSTNAME.

Пару лет назад ваша операционная система systemd имела бы:

  • systemd-journaldделать все вышеперечисленное (и некоторые вещи, которые не имеют отношения к протоколам ) и быть сервером, с которым общаются библиотека GNU C и библиотека systemd C, используя свои соответствующие протоколы
  • вызывается необязательная программа syslog или rsyslog или syslog-ng, либо xinetd/ inetd-style, когда что-то пытается отправлять сообщения /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, вызываемая как прямой сервис, а не через сокет, который напрямую считывает данные из файлов журнала systemd с помощью своего imjournalмодуля
  • опциональный syslog или rsyslog, syslog-ng или udp-syslog-read, прослушивающие трафик RFC 5426

дальнейшее чтение

JdeBP
источник