journalctl: Как эффективно анализировать системные логи

Знакомая ситуация: система работает нестабильно, сервис отказывается запускаться, а в логах — тысячи строк неразборчивого текста. Где искать причину? Использование tail -f /var/log/syslog давно стало анахронизмом. В современном Linux за ведение журналов отвечает systemd journal — централизованная подсистема, а journalctl — ваш главный инструмент для работы с ней.

Утилита journalctl позволяет фильтровать записи по времени, конкретным службам, уровням важности и даже связывать сообщения в логические цепочки. Она поддерживает подсветку синтаксиса и чтение данных в реальном времени.

Базовые команды для повседневной работы

Прежде чем переходить к сложным фильтрам, стоит освоить основу. Помните, что большинство команд требуют прав суперпользователя.

# Просмотр всех накопленных логов (с начала времен)
sudo journalctl

# Режим реального времени (аналог tail -f, но с поддержкой всех фильтров)
sudo journalctl -f

# Просмотр логов конкретного юнита (например, nginx или ssh)
sudo journalctl -u nginx
sudo journalctl -u ssh

# Вывод логов только за текущие сутки
sudo journalctl --since today

# Фильтрация за определенный период
sudo journalctl --since "yesterday 09:00" --until "yesterday 12:00"

Для более тонкой настройки systemd и сервисов такие фильтры экономят часы времени при дебаге.

Фильтрация по уровням важности

В journald используется стандартная классификация уровней (Priority): emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7).

# Только критические ошибки и выше
sudo journalctl -p crit

# Диапазон: от ошибок до предупреждений
sudo journalctl -p err..warning

# Все информационные сообщения и выше
sudo journalctl -p info

Продвинутые возможности journalctl

1. Поиск по содержимому (встроенный grep)

Вам не обязательно передавать вывод через пайп в grep. Утилита умеет искать по шаблону самостоятельно:

# Найти все записи, содержащие "error" (без учета регистра)
sudo journalctl -g "error"

# Детальная информация о конкретном процессе по его PID
sudo journalctl -o verbose _PID=1234

2. Настройка постоянного хранения

По умолчанию логи в некоторых дистрибутивах хранятся только в оперативной памяти (в /run/log/journal) и исчезают после перезагрузки. В отличие от logrotate, который управляет текстовыми файлами, journald имеет встроенные механизмы ротации.

# Включить сохранение логов на диске
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald

# Экспорт среза логов в текстовый файл для отчета
sudo journalctl --since "2 hours ago" > ~/debug_logs.txt

3. Структурированный вывод

Для визуализации зависимостей можно использовать древовидный формат:

sudo journalctl -o tree

Нюансы и советы

  • Ротация: Параметры хранения (максимальный объем, время удержания) настраиваются в файле /etc/systemd/journald.conf.
  • Восстановление: Если система не грузится, вы можете прочитать логи с LiveCD, указав путь к каталогу: journalctl -D /mnt/var/log/journal.
  • Безопасность: Помните, что доступ к логам дает глубокое понимание процессов в системе, поэтому права на чтение журналов должны быть строго ограничены.

Теперь, когда у вас есть один мощный инструмент, вам не нужно комбинировать десятки команд bash. Самая полезная комбинация для старта диагностики: sudo journalctl -f -p err.