Введение / Зачем это нужно
journalctl — это утилита командной строки для просмотра и управления журналами systemd в Linux. Она заменяет традиционные файлы логов в /var/log/ и предоставляет единый интерфейс для всех служб, ядра и системных событий. С помощью этой шпаргалки вы быстро освоите основные команды для фильтрации, поиска и анализа логов, что критично для диагностики сбоев, мониторинга безопасности и устранения неполадок в работе сервисов.
Требования / Подготовка
Перед началом убедитесь, что:
- Ваш дистрибутив использует systemd (проверьте командой
systemctl --version). Большинство современных дистрибутивов (Ubuntu 20.04+, Debian 10+, CentOS 8+, Fedora 35+) поддерживают systemd. - У вас есть доступ к терминалу с правами sudo для некоторых операций (например, просмотр всех логов или очистка).
- Сервис
systemd-journaldактивен (обычно запущен по умолчанию). Проверить статус:sudo systemctl status systemd-journald.
Шаг 1: Базовый просмотр журналов
Самая простая команда выводит все доступные записи журнала в хронологическом порядке (от старых к новым):
journalctl
По умолчанию вывод использует pager (обычно less), что позволяет прокручивать логи. Для вывода всего сразу в терминал (без паузы) добавьте флаг --no-pager:
journalctl --no-pager
Для постраничного просмотра вручную можно использовать конвейер с less:
journalctl | less
В less навигация: стрелки для прокрутки, q для выхода, /текст для поиска.
Шаг 2: Фильтрация по времени
Часто нужно видеть логи за конкретный период. Используйте опции --since и --until. Форматы времени гибкие:
- Абсолютное время:
"2024-01-01 14:30:00" - Относительное:
"1 hour ago","yesterday","today" - Комбинирование:
--since "2024-01-01" --until "now"
Пример: показать логи за последние 2 часа:
journalctl --since "2 hours ago"
Или за определённый день:
journalctl --since "2024-02-15" --until "2024-02-16"
Шаг 3: Фильтрация по службе (юниту systemd)
Чтобы увидеть логи только конкретного сервиса, используйте флаг -u (или --unit) с именем юнита. Например, для SSH-демона:
journalctl -u sshd.service
Можно фильтровать несколько юнитов одновременно:
journalctl -u nginx.service -u mysql.service
Если не знаете точное имя юнита, найдите его через systemctl list-units --type=service.
Шаг 4: Фильтрация по уровню приоритета (лога)
Журналы systemd имеют уровни серьёзности: emerg (критический), alert, crit, err (ошибки), warning, notice, info, debug. Фильтруйте по приоритету флагом -p (или --priority).
Пример: только ошибки и выше (err, crit, alert, emerg):
journalctl -p err
Или диапазон: от warning до err (включительно):
journalctl -p warning..err
Уровень debug покажет самую подробную отладочную информацию.
Шаг 5: Поиск по ключевым словам
journalctl не имеет встроенного grep, но вы можете передать вывод в grep для поиска текста. Это полезно для отлова конкретных сообщений.
Пример: найти все записи, содержащие слово "failed":
journalctl | grep "failed"
Для регистронезависимого поиска добавьте -i:
journalctl | grep -i "authentication"
Комбинируйте с фильтрами по времени или службе для точности:
journalctl -u nginx.service --since "1 hour ago" | grep "404"
Шаг 6: Ограничение вывода и мониторинг в реальном времени
Чтобы не засорять терминал, ограничьте количество строк флагом -n (или --lines). Покажет последние N записей:
journalctl -n 50 # последние 50 строк
Для отслеживания новых логов в реальном времени (аналог tail -f) используйте -f (или --follow):
journalctl -f
Нажмите Ctrl+C для выхода из режима跟随.
Шаг 7: Форматы вывода и экспорт
По умолчанию journalctl использует формат short (читаемый). Для машинной обработки доступны другие форматы через -o (или --output):
jsonилиjson-pretty: структурированный JSON.export: бинарный формат для обмена.cat: только сообщения без метаданных.short-iso: с ISO-временными метками.
Пример экспорта в JSON:
journalctl -o json > logs.json
Для просмотра в формате cat (только текст сообщений):
journalctl -o cat | grep "error"
Шаг 8: Управление размером журнала и очистка
Журналы systemd могут занимать много места. Узнайте текущее использование диска:
journalctl --disk-usage
Для очистки старых данных используйте команды вакуума (очистки):
- Удалить логи старше N дней (например, 7 дней):
sudo journalctl --vacuum-time=7d - Ограничить общий размер журнала (например, 100 МБ):
sudo journalctl --vacuum-size=100M - Оставить только последние N файлов журнала:
sudo journalctl --vacuum-files=5
⚠️ Важно: Очистка безвозвратно удаляет данные. Убедитесь, что вам не нужны старые логи для аудита или расследования.
Шаг 9: Работа с загрузками (boots)
Journal systemd автоматически разделяет логи по загрузкам системы. Просмотрите список доступных загрузок с временными метками:
journalctl --list-boots
Вывод показывает индекс загрузки (0 — текущая, -1 — предыдущая и т.д.) и временные диапазоны.
Чтобы увидеть логи конкретной загрузки, используйте -b (или --boot) с индексом:
journalctl -b -1 # логи предыдущей загрузки
Шаг 10: Продвинутые комбинации и примеры
Комбинируйте фильтры для точного поиска. Вот полезные примеры:
- Логи конкретной службы за последний час:
journalctl -u nginx.service --since "1 hour ago" - Ошибки ядра (kern) с уровнем err и выше:
journalctl -p err -k - Логи текущей загрузки, отсортированные по времени (обратный порядок):
journalctl -b -r # -r для reverse (от новых к старым) - Поиск в логах с подсветкой (используя
lessиgrep):journalctl | grep --color -E "error|failed|warning"
Проверка результата
После выполнения команд убедитесь, что:
- Вывод содержит ожидаемые записи (например, при фильтрации по службе видите только логи этой службы).
- При очистке
journalctl --disk-usageпоказывает уменьшение размера. - Экспортированные файлы (JSON, TXT) корректно открываются и содержат данные.
Если вывод пуст, проверьте:
- Правильность фильтров (время, имя юнита).
- Наличие логов за указанный период (
journalctl --list-boots). - Права доступа (возможно, требуется
sudo).
Возможные проблемы
1. Ошибка "Permission denied" или пустой вывод без sudo
Некоторые логи (особенно системные) доступны только root. Решение: используйте sudo перед командой или настройте группы доступа (например, добавьте пользователя в группу systemd-journal).
2. Слишком много данных, команда "висит"
Журнал может быть огромным. Всегда применяйте фильтры (-u, --since, -p) или ограничение (-n). Для быстрого просмотра последних записей: journalctl -n 100 --no-pager.
3. journalctl не находит логи за определённый период
Возможно, система была перезагружена, и логи за тот период хранятся в другой "загрузке". Используйте journalctl --list-boots для поиска нужного индекса и затем journalctl -b <индекс>.
4. Проблемы с очисткой: "No space left on device" после vacuum
Команда --vacuum может не удалить файлы, если они используются. Остановите критические службы перед очисткой или используйте --vacuum-time с осторожностью. В крайнем случае, временно остановите systemd-journald: sudo systemctl stop systemd-journald, удалите файлы в /var/log/journal/, затем запустите службу.
5. Отсутствует команда journalctl
В редких случаях (очень старые дистрибутивы или минимальные установки) systemd может не быть установлен. Проверьте presence: which journalctl. Если нет, установите systemd через менеджер пакетов (например, sudo apt install systemd на Debian/Ubuntu), но будьте осторожны: замена init-системы может нарушить работу.