journalctl
Половина людей выводит весь журнал и грепает его. Так тоже можно, но у journalctl есть индексы, и фильтровать лучше на его стороне.
Основные фильтры
Один сервис, в реальном времени
Прямой аналог tail -f для systemd-юнита.
Промежуток времени
--since и --until понимают и точные даты, и человеческие описания.
Только ошибки
-p отбирает по приоритету syslog и включает все уровни выше указанного. err — это ещё и crit, alert, emerg.
Уровни по возрастанию серьёзности: debug, info, notice, warning, err, crit, alert, emerg.
Что было до перезагрузки
-b без аргумента — текущая загрузка, -b -1 — предыдущая. Первое, что стоит посмотреть после внезапного ребута.
Ядро отдельно
-k — сообщения ядра, аналог dmesg, но с нормальными временными метками и историей между загрузками.
По процессу или исполняемому файлу
Журнал хранит поля метаданных, по ним можно фильтровать напрямую.
Формат вывода
Все поля записи
Когда непонятно, по какому полю фильтровать, посмотрите на одну запись целиком.
Без пейджера и без обрезки
--no-pager нужен в скриптах, --no-hostname убирает лишнюю колонку на одиночном хосте.
Размер и чистка
Сколько журнал занимает
Урезать журнал
Два способа: по возрасту и по размеру. Оба удаляют только архивные файлы, активный не трогают.
Лучше настроить, чем чистить руками. В /etc/systemd/journald.conf есть SystemMaxUse= — задайте его один раз и перезапустите systemd-journald. Разовый vacuum через месяц придётся повторять.
Журнал не переживает перезагрузку
Если после ребута история пуста, журнал держится в памяти. Лечится параметром Storage=persistent в journald.conf либо созданием каталога.
Когда нужен всё-таки grep
Комбинация фильтра и поиска
Сначала сузить журналом, потом искать. Порядок важен: grep по всему журналу читает гигабайты, grep по одному юниту за час — мегабайты.