Открыть сервисСервис

journalctl: просмотр журналов systemd

journalctl — утилита командной строки в операционных системах Linux для просмотра журналов, собираемых системой инициализации systemd. Она предоставляет интерфейс к двоичному журналу (binary log), который централизованно хранит сообщения ядра, системных служб, демонов и приложений, использующих механизм журналирования systemd. Утилита входит в состав пакета systemd и доступна во всех дистрибутивах, использующих эту систему инициализации, включая Fedora, Arch Linux, openSUSE, Debian и Ubuntu (начиная с версии 15.04).

История и назначение

Журнал systemd (systemd-journald) был представлен в 2010 году как часть проекта systemd, созданного Леннартом Пёттерингом и Кеем Зиберсом. Традиционная система журналирования в Unix, основанная на записи текстовых сообщений в файлы в каталоге /var/log, имела ряд недостатков: сообщения от разных служб разбросаны по множеству файлов, отсутствует структурированность, а интерпретация зависит от формата конкретного приложения. systemd-journald собирает сообщения из всех источников — от ядра через /dev/kmsg, от служб через стандартные потоки вывода и ошибок, от библиотеки libc через системный вызов syslog() — и сохраняет их в централизованном двоичном журнале с метаданными (временная метка, идентификатор процесса, код результата, приоритет).

Журнал хранится в каталоге /var/log/journal/ (при наличии соответствующего каталога) или в энергозависимой памяти /run/log/journal/. Двоичный формат обеспечивает быстрый поиск, фильтрацию и эффективное сжатие данных (алгоритм LZ4 или XZ). Утилита journalctl предназначена для чтения и фильтрации записей этого журнала, преобразуя их в читаемый текст.

Основные режимы работы

Просмотр журнала

Без аргументов journalctl выводит содержимое журнала текущей загрузки, начиная с самых старых записей. Вывод организован в колонки: временная метка, имя хоста, имя службы (или процесса), и само сообщение. Для интерактивного просмотра используется команда journalctl -f (follow), которая выводит новые записи по мере их появления, аналогично tail -f.

Фильтрация по времени

Утилита поддерживает гибкие временные диапазоны. Ключ --since и --until принимают значения в формате "YYYY-MM-DD HH:MM:SS", а также относительные выражения: "yesterday", "today", "1 hour ago", "-15min". Например, journalctl --since "2024-01-15 10:00" --until "2024-01-15 12:00" покажет записи за указанный двухчасовой интервал. Ключ -b ограничивает вывод конкретной загрузкой системы: -b 0 — текущая, -b -1 — предыдущая.

Фильтрация по источнику

Для просмотра журнала конкретной службы используется journalctl -u имя_службы.service. Поддерживаются шаблоны и несколько служб: journalctl -u ssh -u cron. Ключ _PID позволяет фильтровать по идентификатору процесса, _COMM — по имени исполняемого файла, _UID — по идентификатору пользователя. Фильтрация по приоритету сообщений выполняется ключом -p: journalctl -p err покажет только ошибки и более критичные сообщения (уровни emerg, alert, crit, err).

Просмотр ядерных сообщений

Сообщения ядра выделяются в отдельный поток. Ключ -k (или --dmesg) выводит только сообщения ядра текущей загрузки. Это аналог команды dmesg, но с возможностью применения всех фильтров journalctl и доступа к историческим записям.

Формат вывода и метаданные

По умолчанию journalctl выводит записи в коротком текстовом формате. Ключ -o (output) изменяет формат: -o json-pretty выводит записи в виде структурированного JSON с полными метаданными, -o verbose показывает все поля записи в виде пар «поле=значение», -o short-iso использует ISO-8601 временные метки. Для каждой записи журнал хранит десятки полей: MESSAGE, PRIORITY, SYSLOG_IDENTIFIER, _SYSTEMD_UNIT, _HOSTNAME, _CMDLINE, _EXE, _TRANSPORT (источник поступления: journal, syslog, kernel, stdout), а также поля, специфичные для отдельных служб (например, CONTAINER_ID для Docker).

Управление журналом

Ротация и размер

Журнал systemd автоматически ограничивает свой размер. Параметры задаются в файле /etc/systemd/journald.conf: SystemMaxUse (максимальный суммарный размер), SystemMaxFileSize (размер одного файла), MaxRetentionSec (время хранения). По умолчанию журнал занимает не более 10 % размера файловой системы, но не более 4 ГБ. Ручная очистка выполняется командой journalctl --vacuum-size=500M (удалить старые записи до достижения размера 500 МБ), --vacuum-time=30d (оставить записи не старше 30 дней) или --vacuum-files=5 (оставить только 5 файлов журнала).

Постоянное хранение

По умолчанию во многих дистрибутивах журнал хранится в оперативной памяти (/run/log/journal) и теряется при перезагрузке. Для постоянного хранения создаётся каталог /var/log/journal/ или в конфигурации journald.conf устанавливается параметр Storage=persistent. После этого записи переживают перезагрузки, что позволяет анализировать прошлые инциденты.

Проверка целостности

Для двоичного журнала предусмотрена проверка целостности: journalctl --verify сканирует файлы журнала на наличие повреждений и ошибок. Команда journalctl --list-boots выводит список всех загрузок с их идентификаторами и временными диапазонами.

Расширенные возможности

Фильтрация по полям

journalctl позволяет фильтровать записи по произвольному полю метаданных с использованием синтаксиса ПОЛЕ=ЗНАЧЕНИЕ. Например, journalctl _PID=1234 покажет записи конкретного процесса, journalctl _TRANSPORT=kernel — только сообщения ядра. Можно комбинировать несколько условий: journalctl _SYSTEMD_UNIT=nginx.service _PID=1000. Поддерживаются логические операторы + (ИЛИ) и - (НЕ): journalctl _SYSTEMD_UNIT=nginx.service -_PID=1000.

Каталоги журнала

Несколько машин могут направлять журналы в общее хранилище (например, через /var/log/journal/remote/). Ключ -D (directory) позволяет указать путь к каталогу с журналом: journalctl -D /var/log/journal/remote. Ключ --merge объединяет журналы всех доступных машин.

Экспорт и резервное копирование

Ключ --output=export выводит журнал в формате, пригодном для резервного копирования и последующего импорта. Ключ --file позволяет указать конкретный файл журнала для чтения. Для передачи журнала в другую систему используется команда journalctl | ssh server "journalctl --file=-".

Применение на практике

Диагностика сбоев загрузки

При проблемах с загрузкой системы journalctl позволяет проанализировать последовательность событий: journalctl -b -1 -p err покажет ошибки предыдущей загрузки. Команда journalctl -xb выводит журнал текущей загрузки с пояснениями к системным сообщениям.

Аудит безопасности

Журнал хранит записи о входах в систему (через PAM), действиях sudo, изменениях в службах. Анализ journalctl _COMM=sudo позволяет выявить попытки повышения привилегий.

Мониторинг приложений

Приложения, не использующие собственное журналирование, направляют вывод в stderr/stdout, который systemd-journald автоматически перехватывает. Это позволяет централизованно собирать логи всех служб без их дополнительной настройки.

Ограничения и альтернативы

journalctl работает только с журналом systemd; в системах с другой системой инициализации (SysV init, OpenRC) он неприменим. Двоичный формат журнала не является открытым стандартом, что вызывает критику со стороны сторонников традиционных текстовых логов. Для совместимости systemd-journald может перенаправлять сообщения в syslog через сокет /dev/log, что позволяет использовать классические инструменты (logrotate, rsyslog, syslog-ng) параллельно. Существует также библиотека libsystemd и команда coredumpctl для работы с дампами памяти, тесно связанная с журналом.

Источники

  1. man-страница journalctl (systemd 255).
  2. Документация freedesktop.org: «Systemd Journal».
  3. Пёттеринг Л., Зиберс К. — техническая документация проекта systemd.
  4. man-страница systemd-journald.service (systemd 255).
  5. Официальная документация дистрибутивов Fedora, Arch Linux, Ubuntu по работе с journalctl.
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru