🗂 journalctl — исчерпывающий справочник

journalctl — основной инструмент для доступа к журналам 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 поддерживает множество форматов. Вот самые полезные:

Примеры:

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."

Освободить место (несколько вариантов):

sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=2weeks
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

Смотреть только сообщения 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 — готовые полезные примеры

  1. Последние 200 строк для nginx:
sudo journalctl -u nginx -n 200
  1. Следить nginx и php-fpm в реальном времени (в одном окне):
sudo journalctl -u nginx -u php-fpm -f -o cat
  1. Ошибки системного уровня за сегодня:
sudo journalctl -p err --since today
  1. Показать логи предыдущей загрузки (и сразу перейти в конец):
sudo journalctl -b -1 -e
  1. Экспорт логов nginx за вчера и сжать:
sudo journalctl -u nginx --since "yesterday" --until "today" -o export > /tmp/nginx.journal
gzip /tmp/nginx.journal
  1. Сохранить только messages (без метаданных):
sudo journalctl -u nginx -o cat > /tmp/nginx.log
  1. Найти все записи, где PROCESS_NAME=cron и ошибка:
sudo journalctl _COMM=cron -p err
  1. Показать все логи с конкретного исполняемого файла:
sudo journalctl _EXE=/usr/sbin/sshd
  1. Посмотреть, сколько места занимает журнал и автоматически очистить старое, если >1G:
sudo journalctl --disk-usage
sudo journalctl --vacuum-size=1G
  1. Быстрый просмотр последних сообщений (без pager) — удобно для скрипта:
sudo journalctl -u ssh -n 20 --no-pager

💡 Советы и рекомендации (best practices)


✅ Итог

journalctl — гибкий и мощный инструмент: он удобен и для быстрого интерактивного просмотра логов, и для автоматизированного экспорта/анализа. Сочетание фильтров по юнитам, времени, приоритету и полям даёт точные и быстрые выборки — используйте -u, --since/--until, -p, -o json и -f как базовый набор при отладке.