Логи и 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, не копируя чувствительное содержимое.
Что важно запомнить
- Фильтры unit, boot и времени дают воспроизводимый фрагмент журнала.
- Отсутствие записей может быть следствием retention, прав или другого logging namespace.
- Логи содержат данные пользователей и секреты; минимизируйте и маскируйте экспорт.