journalctl — утилита для чтения и анализа журналов systemd-journal. Позволяет фильтровать записи по сервисам, приоритетам, времени, PID, UID и многим другим полям, а также диагностировать проблемы служб в production.

Основные концепции

  • journal — двоичный журнал systemd, объединяющий логи ядра, systemd и пользовательских сервисов.
  • units logging — systemd направляет stdout/stderr сервисов напрямую в журнал.
  • fields — каждая запись содержит множество метаданных (MESSAGE, PRIORITY, _PID, _SYSTEMD_UNIT, _BOOT_ID и др.).
  • persistence — по умолчанию может быть только in-memory; для долговременного хранения требуется /var/log/journal.
  • rate-limiting — journal может дропать сообщения при флуде; это тоже диагностируется.

Структура / состав

  • каталоги журналов: /run/log/journal (volatile), /var/log/journal (persistent).
  • бинарные файлы журналов: system.journal, user-*.journal.
  • поля записи (metadata fields): _SYSTEMD_UNIT, _PID, _COMM, PRIORITY, MESSAGE, _BOOT_ID.
  • конфигурация journald: /etc/systemd/journald.conf и drop-in файлы.
  • выходные форматы: текст, JSON, JSON-pretty, export (монолитный поток).

Минимальные рабочие примеры

# Логи сервиса за текущую загрузку
journalctl -u myapp.service -b
 
# Логи за последние 30 минут
journalctl --since "30 min ago"
 
# Просмотр логов в реальном времени
journalctl -u myapp.service -f
 
# Фильтрация по приоритету (0–7)
journalctl -p err..alert
 
# Фильтрация по PID
journalctl _PID=1234
 
# JSON вывод
journalctl -u myapp.service -o json-pretty
 
# Логи предыдущей загрузки
journalctl -b -1 -u myapp.service
# Пример расширенного запроса: ошибки сервиса за последние 2 часа,
# только MESSAGE и PRIORITY
journalctl -u myapp.service \
  --since "2 hours ago" \
  -p err \
  -o verbose
# Проверка структуры файла журнала
journalctl --verify

Типичные операции / кейсы

  • просмотр логов сервиса:
    • journalctl -u myapp.service -b
    • journalctl -u myapp.service -f
  • анализ падения процесса:
    • journalctl -u myapp.service -p err
    • journalctl -t <tag> если приложение логирует syslog-тегами
  • поиск проблем при старте:
    • фильтрация --since "5 min ago" сразу после рестарта сервиса
  • диагностика предыдущей загрузки:
    • journalctl -b -1 -u myapp.service
  • работа с PID:
    • journalctl _PID=$(pidof myapp)
  • анализ ядра:
    • journalctl -k -p err
  • отлов флудящих сервисов:
    • journalctl -u myapp.service --no-pager | wc -l + анализ rate-limiting
  • экспорт логов:
    • journalctl -u myapp.service --since yesterday > logs.txt
  • централизованное логирование:
    • настройка ForwardToSyslog=yes или использование gateway.

Диагностика / ошибки

  • Логи не сохраняются после перезагрузки — проверить наличие /var/log/journal (нужна persistent storage), владельца и права.
  • Пропадают сообщения — возможно сработало rate-limiting; проверить systemd-journald записи (MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1 указывает на drop).
  • journalctl показывает “File corruption detected” — проверить journalctl --verify, очистить повреждённые файлы, убедиться в корректной работе диска (smartctl, dmesg).
  • Логи сервиса не видны — проверить, что сервис пишет в stdout/stderr (если пишет в файл — journal его не увидит), проверить StandardOutput/StandardError.
  • Нет логов ядра — проверить kernel.printk и что journald собирает сообщения (journalctl -k).
  • journalctl медленный — большой объем persistent-журналов; очистить старые (vacuum-time, vacuum-size) или настроить ограничения в journald.conf.
  • Ошибки прав доступа — убедиться, что пользователь входит в группу systemd-journal или использовать sudo.

Дополнительные материалы