Системный журнал в Linux: Syslog и Journald
Приветствую!

Сегодня теоретическая заметка🗒️. Поговорим про системный журнал (он же лог) в Linux, узнаем кто такие syslog и journald, а также чем они отличаются + коротко про их преимущества и недостатки. Будет познавательно😉.

Введение

Любая сложная система имеет в своем арсенале инструменты журналирования/логирования событий, связанных с работой внутренних сервисов⚙️. Сюда же входит запись вывода (stdout, stderr) пользовательских приложений🧑💻.

Ниже перечислены основные типы событий, которые пишутся в системный журнал📑:

В подавляющем большинстве современных Linux дистрибутивов задачу журналирования решают две популярные службы (они же демоны): Syslog (rsyslog, syslog-ng) и Journald из проекта Systemd. Рассмотрим их по порядку✍️.

Syslog

Syslog  — это стандартный протокол и система для сбора, обработки и хранения логов в Linux и других Unix -подобных операционных системах. Он используется для централизованного сбора и управления логами.

Syslog Daemon — это фоновая служба, которая собственно выполняет всю работу. Ранее в качестве такого демона чаще всего использовался syslogd, но в современных Linux’ах вы скорее всего увидите его современные аналоги: rsyslog  или  syslog-ng. Часто в сообществе их именуют общим термином — Syslog.

Располагаются журналы Syslog в директории /var/log/. Например, системный журнал в DEB системах может называться /var/log/syslog, а в RPM /var/log/messages.

По умолчанию логи в Syslog имеют следующий формат: <Дата и время> <Имя хоста> <Процесс/приложение>: <Сообщение>. Пример записи журнала:

PLAINTEXT
Oct 5 12:34:56 myhost sshd[1234]: Failed password for root from 192.168.1.1 port 22 ssh2
Нажмите, чтобы развернуть и увидеть больше

Syslog классифицирует свои журналы по уровням важности:

А также разделяет их по категориям (facilities):

Весь список смотрите тут.

Как и многие сервисы в Linux, Syslog настраивается с помощью конфигурационных файлов. В случае rsyslog это /etc/rsyslog.conf или файлы в каталоге /etc/rsyslog.d/. В них определяются правила, куда и как записывать логи.

Очевидным последствием работы системы журналирования является создание большого количества объемных файлов. Для решения этой задачи служба Syslog часто используется в связке с утилитой ротации логов (сжатие и удаления старых записей): logrotate. Конфигурируется  logrotate с помощью файлов /etc/logrotate.conf и /etc/logrotate.d/*.

На сегодняшний день Syslog не потерял своей актуальности в мире Linux, но его однозначно потеснила система журналирования под названием Journald☝️.

Journald

Journald — это система управления логами, которая является частью комбайна системы инициализации Systemd. В отличие от традиционного Syslog, Journald предлагает более современный и интегрированный подход к сбору, хранению и управлению логами.

В качестве демона выступает программа с именем systemd-journald. Если Syslog собирает и хранит логи в текстовом формате, то Journald — в бинарном. Т.к. Journald тесно интегрирован в Systemd, он является системой журналирования по умолчанию во многих современных дистрибутивах Linux: Debian, Ubuntu, Arch Linux, Fedora, RHEL, CentOS.

Формат записей похож на Syslog:

PLAINTEXT
feb 08 18:22:52 myhost sshd[1777]: Server listening on 0.0.0.0 port 39178.
Нажмите, чтобы развернуть и увидеть больше

Файлы журналов Journald располагаются в /var/log/journal/.

Настройки поведения демона задаются в файле /etc/systemd/journald.conf.

Т.к. логи Journald хранятся в структурированном виде и помимо вывода сервисов содержат метаданные, размер файлов журналов может быть больше, в сравнении с обычными текстовыми файлами.

Что еще стоит отметить про Journald:

Коротко про преимущества и недостатки

К преимуществам Syslog можно отнести его универсальность (поддержка всеми Unix-системами и различными сетевыми устройства), текстовый формат логов для удобного чтения и обработки, а также независимость от Systemd. Из недостатков: отсутствие структурированных данных, меньшая производительность при больших объемах и сложная настройка.

Journald, в свою очередь, быстрее благодаря бинарному формату, гибче за счет структурированных данных, имеет отличные возможности по поиску и фильтрации информации, ну конечно тесная интеграция с Systemd. Из недостатков: зависимость от Systemd, ограниченная совместимость со старыми инструментами.

Как работает журналирование на примере Linux Mint

Ранее я упоминал, что в современных системах Linux, чаще всего за процесс журналирования отвечает демон Journald.

Чтобы понять, какая система используется у вас, выполните:

BASH
pgrep -af 'syslog|journald'
Нажмите, чтобы развернуть и увидеть больше

Команда pgrep ищет запущенные процессы по указанному шаблону в имени команды процесса.

В обычном Debian ожидаемо используется Journald:

В Linux Mint 22 или LMDE6 используется:

И rsyslog и systemd-journald?

К слову, Journald и Syslog могут работать совместно, осуществляя взаимодействие, например, через systemd сокеты. Предположу, что у разработчиков Linux Mint была необходимость в такой конфигурации🤷♂️.

Давайте копнем чуть глубже. Rsyslogd традиционно использует сокет /dev/log для приёма лог-сообщений от приложений. Но в системах с Systemd по этому адресу расположена символьная ссылка на сокет Systemd: /run/systemd/journal/dev-log, что позволяет systemd-journald перехватывать сообщения, отправленные в /dev/log и сохранять их в своём журнале:

BASH
ls -l /dev/log
Нажмите, чтобы развернуть и увидеть больше

Если заглянуть в содержимое файла-юнита systemd-journald.service:

BASH
systemctl cat systemd-journald.service
Нажмите, чтобы развернуть и увидеть больше

То в списке Sockets мы и увидим тот самый /run/systemd/journal/dev-log:

PLAINTEXT
[Unit]
Requires=systemd-journald.socket

[Service]
Sockets=systemd-journald.socket systemd-journald-dev-log.socket systemd-journald-audit.socket
Нажмите, чтобы развернуть и увидеть больше

Казалось бы, на этом все, но нет. Заглянем в юнит файл сервиса rsyslog.service:

BASH
systemctl cat rsyslog.service
Нажмите, чтобы развернуть и увидеть больше

Видим, что он требует запущенного юнита syslog.socket и имеет алиас syslog.service:

PLAINTEXT
[Unit]
Requires=syslog.socket

[Install]
Alias=syslog.service
Нажмите, чтобы развернуть и увидеть больше

Смотрим далее syslog.socket:

BASH
systemctl cat syslog.socket
Нажмите, чтобы развернуть и увидеть больше

Тут видим, что сервис Syslog использует специальный сокет Systemd /run/systemd/journal/syslog:

PLAINTEXT
[Socket]
ListenDatagram=/run/systemd/journal/syslog
Нажмите, чтобы развернуть и увидеть больше

systemd-journald предоставляет этот сокет для передачи собранных логов другим системам логирования, таким как rsyslogd. В случае Linux Mint rsyslogd настроен на чтение сообщений из этого сокета.

Довольно запутанная схема, которая еще и дублирует логи.

Теперь пара слов о том, как отправлять данные в системный журнал. Чаще всего для этого используется утилита logger, которая пишет в традиционный сокет /dev/log и который обычно слушает Syslog. Но в случае Linux Mint данные перенаправляются в сокет Systemd. В итоге при выполнении команды:

BASH
logger "Это тестовое сообщение"
Нажмите, чтобы развернуть и увидеть больше

Подробнее про то, как отправлять вывод команд/скриптов в системный журнал или файл смотрите эту заметку.

Данные попадут и в Syslog и Journald. Проверим:

BASH
grep $(date +"%F") /var/log/syslog | grep 'тестовое'

journalctl --since $(date +"%F") --grep 'тестовое'
Нажмите, чтобы развернуть и увидеть больше

В команде выше конструкция $(date +"%F") подставляет текущую дату в формате 2025-03-07.

Если предпочитаете нативный способ передачи данных в Journald, воспользуйтесь командой systemd-cat:

BASH
echo "Это второе тестовое сообщение" | systemd-cat

journalctl --since $(date +"%F") --grep 'второе тестовое'
Нажмите, чтобы развернуть и увидеть больше

Напоследок, посмотрим, какие сервисы задействуют рассмотренные выше сокеты с помощью команды lsof (list open files):

BASH
sudo lsof /run/systemd/journal/syslog /run/systemd/journal/dev-log
Нажмите, чтобы развернуть и увидеть больше

Обратите внимание, что для выполнения команды выше необходимы привилегированные права sudo.

Полезные материалы

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/it-theory/syslog-journald-sistemnyj-zhurnal-v-linux/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша