Зачем не просто tail /var/log/syslog
- Один источник - kernel, init, сервисы, syslog-API, stdin/stderr запущенных через systemd процессов
- Структурированные поля - кроме текста есть
_PID,_UID,_COMM,MESSAGE_ID, любыеKEY=valueот приложения - Бинарный формат - компактнее, индексируется
- Boot-aware - есть концепция «текущей загрузки», легко отфильтровать
Базовые команды
bash
journalctl # весь журнал (от старого к новому)
journalctl -e # сразу в конец (как less -G)
journalctl -f # follow (как tail -f)
journalctl -n 50 # последние 50 строк
journalctl -r # reverse: новые сверху
Фильтры
bash
journalctl -u nginx # только unit nginx (см. [[cmd-systemctl]])
journalctl -u nginx -u php-fpm # несколько unit'ов
journalctl -p err # priority: emerg/alert/crit/err/warning/notice/info/debug
journalctl --since "1 hour ago"
journalctl --since "2024-01-01" --until "2024-01-02 12:00"
journalctl _PID=1234 # по PID (структурное поле)
journalctl _COMM=sshd # по имени процесса
journalctl -k # только kernel-сообщения (= dmesg)
По загрузкам
bash
journalctl --list-boots # список всех загрузок системы
journalctl -b # только текущая загрузка
journalctl -b -1 # предыдущая (`-1` = на одну назад)
Это важно когда система падала и перезапускалась - отделить «было до» и «началось после».
Форматы вывода
bash
journalctl -u nginx -o json # JSON по строке - для парсинга
journalctl -u nginx -o json-pretty
journalctl -o cat -u nginx # только MESSAGE, без префиксов
journalctl -o verbose # ВСЕ структурированные поля
Размер журнала
bash
journalctl --disk-usage # сколько занимает на диске
sudo journalctl --vacuum-size=500M # обрезать до 500 MB
sudo journalctl --vacuum-time=7d # удалить старше 7 дней
Конфиг лимитов - /etc/systemd/journald.conf (SystemMaxUse=,
MaxRetentionSec=).
Persistent vs volatile
По умолчанию на многих дистро журнал в RAM (/run/log/journal) -
пропадает при ребуте. Чтобы сохранять:
bash
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald