journalctl: Полное руководство по работе с системными логами
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.