journalctl: фильтрация и форматирование логов systemd
Логи пропали. Сервер перезагрузили — и привычный less /var/log/syslog молчит. В современных дистрибутивах с systemd логи собирает journald, а читает их journalctl. Если не знать его фильтры, работа с системой превращается в гадание.
Почему логи исчезают после перезагрузки
По умолчанию journal хранит данные в /run/log/journal/ — это tmpfs, сбрасывается при ребуте. Чтобы логи переживали перезагрузку, создайте директорию:
После этого перезапустите systemd-journald:
Проверить текущее расположение и объём:
На свежих CentOS/RHEL 8+ и Fedora директория /var/log/journal создаётся автоматически. На Debian/Ubuntu — обычно нет.
Фильтрация по юниту и диапазону времени
Самый частый кейс — логи конкретного сервиса:
Комбинируйте несколько юнитов через повтор флага:
Временные фильтры — для отладки инцидентов:
Столкнулись с падением ночью — смотрите логи за тот период, а не весь буфер.
Если временной фильтр возвращает пустой вывод — проверьте часовой пояс. journalctl хранит метки в UTC, а --since интерпретирует локальное время.
Фильтрация по приоритету
Уровни логов соответствуют syslog:
| Уровень | Число | Описание |
|---|---|---|
| emerg | 0 | Система неработоспособна |
| alert | 1 | Требуется немедленное действие |
| crit | 2 | Критическая ошибка |
| err | 3 | Ошибка |
| warning | 4 | Предупреждение |
| notice | 5 | Заметное событие |
| info | 6 | Информационное |
| debug | 7 | Отладочное |
Флаг -l показывает полные hostname вместо сокращённых.
Просмотр логов ядра и загрузки
Ядро шлёт свои сообщения отдельно. Флаг -k заменяет dmesg:
Список всех загрузок:
Вывод:
Выбрать конкретную загрузку:
Для анализа загрузки используйте systemd-analyze:
Поиск по регулярному выражению
Грепать вывод journalctl бессмысленно — теряете метаданные. Вместо этого -g (–grep):
-g поддерживает базовые регулярки. Для сложных условий комбинируйте с --since:
Так вы держите выборку по юниту и времени, а затем фильтруете по паттерну.
Follow-режим (-f)
Аналог tail -f для journald. В отличие от слежения за файлом, follow работает с любым фильтром:
В терминале Ctrl+C останавливает follow. Из скрипта — через timeout или сигнал.
Запускайте -f в отдельном окне tmux/screen. Если окно закроется, логи продолжат писаться в journald — данные не потеряются.
Флаги комбинируются через AND: -u nginx -p err покажет ошибки только из nginx. Для OR по юнитам используйте поля journald:
Другие полезные поля:
Форматы вывода
По умолчанию journalctl pager’ит вывод. Для скриптов и передачи в jq нужна машиночитаемая форма:
| Флаг | Описание | Применение |
|---|---|---|
-o short | Классический syslog | По умолчанию |
-o short-iso | Время в ISO 8601 | Логирование в SIEM |
-o short-precise | Миллисекунды | Точный тайминг |
-o verbose | Все поля | Максимум деталей |
-o json | JSON Lines | jq, Splunk, ELK |
-o cat | Только MESSAGE | Минимализм |
-n 100 ограничивает вывод последними 100 строками. --no-pager отключает pager для скриптов.
Очистка и управление размером журнала
journald ротирует логи по размеру и времени. Настраивается в /etc/systemd/journald.conf:
Применить без рестарта:
Очистить место вручную:
--vacuum-* удаляет только файлы, превышающие лимит. Чтобы освободить место наверняка, увеличьте SystemMaxUse и перезапустите journald.
Типичные ошибки
journalctl: cannot open files — нет прав. Добавьте себя в группу systemd-journal:
Логи пустые после перезагрузки — не настроено персистентное хранилище (первая секция).
journalctl зависает — огромный буфер. Начните с -b или ограничьте время --since.
Нет логов юнита — проверьте, что юнит вообще запускался:
journalctl заточен под быстрый поиск. Не читайте логи глазами — фильтруйте сразу.