🗂 journalctl — исчерпывающий справочник
journalctl — основной инструмент для доступа к журналам systemd-journald. В этом материале — всё, что нужно знать для эффективной диагностики: фильтры, форматы вывода, работа с таймингом, очистка, экспорт и практические примеры.
📑 Содержание
- Важные предварительные замечания
- Быстрый старт — основные команды
- Фильтрация по юнитам, PID, полям и приоритету
- Фильтрация по времени и по загрузкам (boots)
- Форматы вывода и парсинг (json, cat, verbose)
- Реальное время / follow / tail
- Работа с файлом журнала / экспорт / импорт
- Обслуживание журнала (disk usage, vacuum, rotate)
- Отладка и расширенные приёмы
- Полезные готовые примеры (cheatsheet)
- Короткие советы и рекомендации
🔰 Важные предварительные замечания
-
Для большинства действий с системными журналами требуются права root. Используйте
sudo journalctl ....
Некоторые дистрибутивы позволяют чтение членам группыsystemd-journal, но чаще проще запускать сsudo. -
Журнал может быть volatile (в памяти:
/run/log/journal) или persistent (на диске:/var/log/journal).
Чтобы включить хранение на диске:# опция 1: создать директорию для persistent storage и перезапустить journald sudo mkdir -p /var/log/journal sudo systemctl restart systemd-journald # опция 2: в /etc/systemd/journald.conf установить: # Storage=persistent # и затем: sudo systemctl restart systemd-journald
После этого логи будут храниться между перезагрузками.
🚀 Быстрый старт — основные команды
Показать все логи (начиная с самого древнего):
sudo journalctl
Показать последние N строк:
sudo journalctl -n 100 # последние 100 строк
sudo journalctl -e # перейти в конец (как tail -n +?)
Следить в реальном времени (аналог tail -f):
sudo journalctl -f
Показать логи конкретной службы (unit):
sudo journalctl -u nginx.service
Показать логи с текущей загрузки:
sudo journalctl -b
Показать логи ядра (dmesg):
sudo journalctl -k
🔎 Фильтрация — по юниту, PID, полям, приоритету и тексту
По unit (службе)
sudo journalctl -u ssh.service
sudo journalctl -u nginx.service -u php-fpm.service # несколько юнитов
По процессу / PID / User
sudo journalctl _PID=12345
sudo journalctl _UID=1000
sudo journalctl _EXE=/usr/sbin/sshd
Поля (такие как
_PID,_UID,_EXE,_COMM,_SYSTEMD_UNIT,SYSLOG_IDENTIFIER) можно использовать как фильтрыkey=value.
По приоритету (severity)
Уровни: emerg(0), alert(1), crit(2), err(3), warning(4), notice(5), info(6), debug(7).
Показывать ошибки и выше (err, crit, alert, emerg):
sudo journalctl -p err
Цифровой вариант:
sudo journalctl -p 3
По тексту (grep)
journalctl сам по себе умеет фильтровать по полям, но для поиска по тексту удобно pipe + grep:
sudo journalctl -u nginx.service | grep "timeout"
Или лучше (включает форматирование, не теряя цветов) — используйте -o cat:
sudo journalctl -u nginx.service -o cat | grep "timeout"
⏱ Фильтрация по времени и по загрузкам (boot)
--since / --until
Поддерживаются абсолютные (YYYY-MM-DD HH:MM:SS) и относительные форматы ("today", "yesterday", "2 hours ago"):
sudo journalctl --since "2025-10-01 08:00:00" --until "2025-10-01 12:00:00"
sudo journalctl --since "2 hours ago"
sudo journalctl --since today
По загрузкам (boots)
Показать логи текущей загрузки:
sudo journalctl -b
Показать логи предыдущей загрузки:
sudo journalctl -b -1
Список доступных загрузок:
sudo journalctl --list-boots
Выведет что-то вроде:
-1 9f5b… Thu 2025-10-02 10:00:00 CEST — Thu 2025-10-02 12:00:00 CEST
0 a3c4… Thu 2025-10-02 12:00:01 CEST — now
Можно выбрать boot по его индексу (-b -1) или по ID (-b a3c4…).
🖨 Форматы вывода и примеры (опция -o / --output)
journalctl поддерживает множество форматов. Вот самые полезные:
-o short(по умолчанию) — компактный вывод с датой.-o short-iso— ISO timestamps: удобно в скриптах.-o short-precise/short-iso-precise— timestamps с микросекундами.-o verbose— полная информация: все поля (очень много).-o export— бинарный экспорт для последующего чтенияjournalctl --file=....-o json/-o json-pretty/-o json-sse— для парсинга (jq).-o cat— печатает только значениеMESSAGE(без заголовков/метаданных).
Примеры:
sudo journalctl -u nginx -n 50 -o short-iso
sudo journalctl -u nginx -n 50 -o json-pretty | jq '.[]._SYSTEMD_UNIT, .[].MESSAGE'
sudo journalctl -u nginx -o cat | tail -n 20
🔁 Follow / tail — смотреть логи в реальном времени
Аналоги tail -f:
sudo journalctl -f # все новые логи
sudo journalctl -u nginx -f # только nginx, в реальном времени
sudo journalctl -f -o cat # только сообщения (удобно для парсинга)
sudo journalctl -u nginx -n 200 -f # последние 200 строк, затем follow
💾 Экспорт и чтение файлов журнала
Экспорт текущих записей в единый файл (binary export)
sudo journalctl -u nginx --since "2025-10-07" -o export > /tmp/nginx.journal
# читать:
sudo journalctl --file=/tmp/nginx.journal
Экспорт в текст / JSON
sudo journalctl -u nginx --since today -o json-pretty > /tmp/nginx.json
Передача/анализ: JSON удобно передавать в аналитические инструменты или парсить jq.
🧹 Обслуживание журналов: disk-usage, vacuum, rotate
Проверить занимаемое место журналом:
sudo journalctl --disk-usage
# Output: "Archived and active journals take up 1.2G in the file system."
Освободить место (несколько вариантов):
- Удалить старые файлы, пока общее занятое место не станет <= 500M:
sudo journalctl --vacuum-size=500M
- Удалить файлы старше заданного времени:
sudo journalctl --vacuum-time=2weeks
- Оставить не более N файлов журнала:
sudo journalctl --vacuum-files=5
Принудительно выполнить ротацию журналов:
sudo journalctl --rotate
sudo systemctl kill -s SIGHUP systemd-journald # вариант, чтобы journald перечитал конфигурацию
Проверить/верифицировать целостность файлов:
sudo journalctl --verify
🛠 Отладка и расширенные приёмы
Показать все поля для одной записи
sudo journalctl -u nginx -n 1 -o verbose
Вы увидите полный набор полей _PID, _UID, _SYSTEMD_UNIT, _COMM, _EXE, _CAP_EFFECTIVE, MESSAGE и др.
Показать сообщения в обратном порядке (новые первыми)
sudo journalctl -r -n 200
Показывать расширенные подсказки для сообщений (catalog)
sudo journalctl -u ssh -p err -x
Опция -x пытается добавить объяснения из базы systemd (если есть).
Использовать --no-pager / --no-full
--no-pager— вывод не черезless, полезно в скриптах.--no-full— сокращает длинные поля.
Смотреть только сообщения kernel (dmesg-like)
sudo journalctl -k -b # kernel messages for current boot
sudo journalctl -k -b -1 # kernel messages for previous boot
Комбинирование большого количества фильтров
Пример: показать ошибки nginx и php-fpm за последние 24 часа, в формате ISO:
sudo journalctl -u nginx.service -u php-fpm.service -p err --since "24 hours ago" -o short-iso
Парсинг JSON + jq
Получить только сообщения и метку времени:
sudo journalctl -u nginx -o json-pretty | jq -r '.MESSAGE, .__REALTIME_TIMESTAMP'
📋 Cheatsheet — готовые полезные примеры
- Последние 200 строк для nginx:
sudo journalctl -u nginx -n 200
- Следить nginx и php-fpm в реальном времени (в одном окне):
sudo journalctl -u nginx -u php-fpm -f -o cat
- Ошибки системного уровня за сегодня:
sudo journalctl -p err --since today
- Показать логи предыдущей загрузки (и сразу перейти в конец):
sudo journalctl -b -1 -e
- Экспорт логов nginx за вчера и сжать:
sudo journalctl -u nginx --since "yesterday" --until "today" -o export > /tmp/nginx.journal
gzip /tmp/nginx.journal
- Сохранить только messages (без метаданных):
sudo journalctl -u nginx -o cat > /tmp/nginx.log
- Найти все записи, где PROCESS_NAME=cron и ошибка:
sudo journalctl _COMM=cron -p err
- Показать все логи с конкретного исполняемого файла:
sudo journalctl _EXE=/usr/sbin/sshd
- Посмотреть, сколько места занимает журнал и автоматически очистить старое, если >1G:
sudo journalctl --disk-usage
sudo journalctl --vacuum-size=1G
- Быстрый просмотр последних сообщений (без pager) — удобно для скрипта:
sudo journalctl -u ssh -n 20 --no-pager
💡 Советы и рекомендации (best practices)
- Запуск от root: большинство операций требуют
sudo. Добавлять пользователя в группуsystemd-journalможно, но проще —sudo. - Хранение на диске: включайте
Storage=persistentна production-серверах — иначе после перезагрузки потеряете логи. - Ограничение размера: в
/etc/systemd/journald.confзадавайтеSystemMaxUse,SystemKeepFree,SystemMaxFileSizeи т.п., чтобы журналы не заняли весь диск. - Пишите в stdout/stderr: сервисы должны писать логи в stdout/stderr — systemd-journald автоматически их поймает.
- Используйте
-uи--sinceдля точной выборки — это быстрее и читабельнее, чем grep по всем журналам. - JSON + jq — удобный путь для интеграции в пайплайны / мониторинг.
- Архивируйте важные журналы: экспортируйте
-o exportи храните/передавайте бинарный файл, если нужно перенести или сохранить целостность.
✅ Итог
journalctl — гибкий и мощный инструмент: он удобен и для быстрого интерактивного просмотра логов, и для автоматизированного экспорта/анализа. Сочетание фильтров по юнитам, времени, приоритету и полям даёт точные и быстрые выборки — используйте -u, --since/--until, -p, -o json и -f как базовый набор при отладке.