Логи и journalctl: фильтрация событий по сервису и времени

systemd journal хранит структурированные записи: сообщение дополняется unit, PID, priority, boot и другими полями. Полезная диагностика начинается с узкого временного окна и нужного unit, иначе важная причина теряется среди тысяч соседних событий.

Фильтр по unit и времени

journalctl --unit example.service \
  --since '15 minutes ago' \
  --until now \
  --output short-iso-precise \
  --no-pager

На реальной машине замените example.service точным unit. --no-pager важен для CI/копирования: команда не ждёт интерактивный less. Absolute timestamps с timezone лучше относительных при совместном расследовании.

Boot, priority и follow

journalctl --list-boots --no-pager
journalctl --boot -1 --priority warning --no-pager
journalctl --unit example.service --follow

--boot -1 выбирает предыдущую загрузку и помогает после reboot. Priority warning включает более серьёзные уровни. Follow подходит для короткого воспроизведения, но его нужно останавливать; это не долговременное хранение incident evidence.

Поля вместо поиска по тексту

Фильтры вида _PID=, _SYSTEMD_UNIT= и SYSLOG_IDENTIFIER= точнее grep по сообщению. JSON-output позволяет исследовать fields машинно, но каждая строка является отдельным JSON-object.

journalctl --unit example.service -n 20 -o json \
  | head -n 1 \
  | python3 -m json.tool

Перед отправкой логов проверьте tokens, personal data и request bodies. Структурированность не делает содержимое безопасным для публикации.

Почему записи могут отсутствовать

Journal бывает volatile в /run или persistent в /var/log/journal. Retention, vacuum и лимиты удаляют старые сегменты. Обычный пользователь может видеть только свои записи или units согласно группам/policy. Контейнер также может писать в собственный logging driver, а не host journal.

Ошибка и диагностика

Симптом No entries не доказывает, что service молчал. Проверьте точное имя unit, boot, временную зону, права, host/container и текущий Storage. Сопоставьте systemctl show MainPID/ExecMainStartTimestamp с интервалом. Не расширяйте запрос сразу на весь journal: сначала установите границу события.

Практика

Выберите доступный unit, выведите последние 20 записей с ISO timestamps, затем ограничьте priority и boot. Найдите PID одной записи и сопоставьте процессу, если он ещё жив. Сохраните команду фильтра как часть incident note, не копируя чувствительное содержимое.

Что важно запомнить

Источники