journalctl — командная утилита для чтения журнала systemd (systemd Journal). В отличие от классических текстовых логов в /var/log/, Journal хранит события в бинарном формате с богатыми метаданными: unit-имя, PID, UID, имя хоста, временная метка в наносекундах. Это ускоряет фильтрацию и поиск по тысячам записей.
Как работает
Демон systemd-journald собирает сообщения из нескольких источников: stdout/stderr сервисов systemd, syslog-сокета, ядра (kmsg) и аудит-фреймворка. Каждая запись тегируется метаданными автоматически — не нужно настраивать парсинг. Журнал хранится в /run/log/journal/ (RAM, не переживает перезагрузку) или /var/log/journal/ (диск, постоянный).
Основные команды
# Все логи (с пагинацией less)
journalctl
# Последние 100 строк
journalctl -n 100
# Следить за новыми записями (как tail -f)
journalctl -f
# Логи конкретного сервиса
journalctl -u nginx.service
# Логи за последний час
journalctl --since "1 hour ago"
# Логи между датами
journalctl --since "2024-01-01 00:00" --until "2024-01-02 00:00"
# Только ошибки (priority 3 = err)
journalctl -p err
# Логи текущей загрузки
journalctl -b
# Предыдущей загрузки
journalctl -b -1
# JSON-вывод для парсинга
journalctl -u nginx -o json-pretty | head -50
История
journalctl появился в 2012 году как часть systemd 38. Автор systemd Леннарт Поттеринг предложил заменить текстовые syslog-файлы структурированным бинарным журналом. Переход встретил сопротивление: администраторы, привыкшие к tail -f /var/log/syslog, критиковали бинарный формат как непрозрачный. Ответом стала полная совместимость — journald также пишет в syslog-сокет, и традиционные файлы продолжают работать параллельно.
Фильтрация и анализ
Мощная сторона journalctl — комбинирование фильтров. Пример: все ошибки nginx за вчера:
journalctl -u nginx.service -p err --since yesterday
Поиск по полям: journalctl _PID=1234 — все записи от процесса с PID 1234. journalctl _UID=1000 — записи от конкретного пользователя. journalctl SYSLOG_IDENTIFIER=php-fpm — записи PHP-FPM без привязки к unit.
Для экспорта в Grafana или Datadog используется вывод в JSON: journalctl -o json. Loki от Grafana Labs нативно читает journald через Promtail-агент.
Управление размером журнала
Журнал занимает не более 10% файловой системы по умолчанию. Настраивается в /etc/systemd/journald.conf:
SystemMaxUse=500M # максимальный размер на диске
SystemKeepFree=1G # минимум свободного места
MaxRetentionSec=30day # хранить не дольше 30 дней
Принудительная очистка: journalctl --vacuum-size=200M или journalctl --vacuum-time=7d.
На что обращать внимание
Бинарный формат журнала может повредиться при жёсткой перезагрузке. Признак — сообщение «Journal file is corrupted». Исправление: journalctl --verify, затем удалить повреждённые файлы из /var/log/journal/. На высоконагруженных серверах с тысячами событий в секунду journald настраивают на форвардинг в log-server и ограничивают локальный объём.
На серверах с высокой нагрузкой используйте journalctl -u nginx --output=cat для вывода без метаданных — быстрее парсится скриптами.