Введение / Зачем это нужно
journalctl — это мощная утилита для просмотра и анализа журналов, собираемых systemd-journald. В современных дистрибутивах Linux она часто заменяет традиционные текстовые логи в /var/log/. С её помощью вы можете быстро найти причину сбоя службы, отследить события безопасности или просто понять, что происходит в системе. Этот гайд превратит вас из новичка в уверенного пользователя journalctl.
Требования / Подготовка
- Операционная система: Любой современный Linux-дистрибутив с systemd (проверьте командой
systemctl --version). - Права доступа: Для просмотра всех логов, включая сообщения от ядра и системных служб, обычно требуются права root. Используйте
sudoили войдите под суперпользователем. - Журнал должен быть активен: Убедитесь, что служба
systemd-journaldработает:systemctl status systemd-journald. - Понимание структуры логов: Журналы systemd хранятся в бинарном формате (обычно в
/var/log/journal/или/run/log/journal/). Это позволяет эффективно индексировать и фильтровать записи по метаданным.
Пошаговая инструкция
Шаг 1: Базовый просмотр всего журнала
Просто введите команду journalctl. Вы увидите полный лог системы, начиная с самого раннего доступного записи, в хронологическом порядке (от старых к новым).
sudo journalctl
- Навигация: Используйте
PgUp/PgDownили стрелки. Для поиска по тексту внутри less-просмотрщика нажмите/, введите запрос иEnter. - Выход: Клавиша
q. - По умолчанию: Вывод ограничен последними записями (зависит от конфигурации). Чтобы видеть всё, используйте
--no-pagerдля вывода в терминал без паузы.
Шаг 2: Фильтрация по времени
Это один из самых частых сценариев. Journalctl понимает гибкие временные форматы.
# Логи за сегодня
sudo journalctl --since today
# Логи за последние 2 часа
sudo journalctl --since "2 hours ago"
# Логи за конкретный день
sudo journalctl --since "2026-02-14" --until "2026-02-15"
# Логи с 9:00 до 18:00 сегодня
sudo journalctl --since "09:00" --until "18:00"
Шаг 3: Фильтрация по службе (юниту systemd)
Чтобы увидеть логи только определённой службы (например, nginx или docker), используйте флаг -u.
# Логи службы SSH
sudo journalctl -u ssh.service
# Логи службы Docker за последние 30 минут
sudo journalctl -u docker.service --since "30 minutes ago"
Это исключает весь "шум" от других процессов и сразу фокусирует вас на проблеме.
Шаг 4: Фильтрация по приоритету (уровню логирования)
Системные сообщения имеют уровни серьезности. Фильтруйте по ним, чтобы игнорировать менее важные записи.
# Только ошибки (err) и критические (crit, alert, emerg)
sudo journalctl -p err
# Все, кроме отладочных (debug) и информационных (info)
sudo journalctl -p warning..crit
# Уровни (от самого высокого к низкому):
# emerg, alert, crit, err, warning, notice, info, debug
Можно комбинировать с другими фильтрами: sudo journalctl -u nginx -p err.
Шаг 5: Поиск по ключевым словам и полям
Используйте grep-подобный синтаксис для поиска в тексте сообщений или фильтрацию по структурированным полям (например, _PID, _COMM, SYSLOG_IDENTIFIER).
# Простой текстовый поиск (игнорирует регистр)
sudo journalctl | grep -i "failed"
# Поиск по имени исполняемого файла (например, все вызовы apt)
sudo journalctl _COMM=apt
# Поиск по ID процесса (PID)
sudo journalctl _PID=1234
# Комбинация: найти ошибки в службе cron
sudo journalctl -u cron -p err
💡 Совет: Для поиска по полям используйте синтаксис
ПОЛЕ=значение. Список всех полей записи можно увидеть в выводеjournalctl -o verboseили в документации.
Шаг 6: Мониторинг в реальном времени (аналог tail -f)
Добавьте флаг -f (follow) к любой команде, чтобы видеть новые записи по мере их появления.
# Отслеживать все новые логи
sudo journalctl -f
# Отслеживать логи только службы NetworkManager
sudo journalctl -u NetworkManager -f
# Отслеживать ошибки в реальном времени
sudo journalctl -p err -f
Используйте Ctrl+C для остановки.
Шаг 7: Управление выводом (форматирование и ограничение)
Узнайте, как сделать вывод более читаемым или ограничить его объём.
# Показать только последние 50 записей (аналог tail)
sudo journalctl -n 50
# Показать записи с определённого времени вперёд (прямой хронологический порядок)
sudo journalctl --reverse
# Вывод в формате "кратко" (одна строка на запись)
sudo journalctl -o short
# Вывод в формате "JSON" для парсинга скриптами
sudo journalctl -o json --no-pager
# Очистить журнал (требует root, будьте осторожны!)
sudo journalctl --rotate
sudo journalctl --vacuum-time=3d # Удалить записи старше 3 дней
Проверка результата
Вы успешно освоили journalctl, если можете:
- Найти логи ошибки для конкретной службы за последний час.
- Отфильтровать записи только критического уровня.
- Запустить мониторинг логов нового процесса в реальном времени.
- Поискать все вызовы определённой команды (например,
sudo) по полю_COMM.
Проверочный тест: Выполните команду sudo journalctl -u systemd-journald -p err --since today. Если вывод не пуст и показывает записи — фильтрация работает.
Возможные проблемы
Проблема: "No journal files were found"
Причина: Служба systemd-journald не запущена, журнал отключён или хранится только в памяти (/run/log/journal/, который очищается при перезагрузке).
Решение:
- Проверьте статус:
sudo systemctl status systemd-journald. - Если служба неактивна, запустите:
sudo systemctl start systemd-journald. - Проверьте конфигурацию в
/etc/systemd/journald.conf. Убедитесь, чтоStorage=не установлен вnoneилиvolatile. Для постоянного хранения на диске должно бытьStorage=autoилиStorage=persistent.
Проблема: Недостаточно прав для просмотра логов
Причина: Некоторые записи (например, от ядра или некоторых служб) доступны только root.
Решение: Всегда используйте sudo перед journalctl, если вам нужен полный доступ. Для просмотра только пользовательских логов (своих процессов) sudo может не понадобиться.
Проблема: Журнал слишком большой, команды работают медленно
Причина: Накоплено много исторических данных. Решение: Регулярно выполняйте "вакуумацию" (очистку) старых записей. Например, чтобы оставить логи только за последние 7 дней:
sudo journalctl --vacuum-time=7d
Или ограничьте общий размер журнала (например, 500МБ):
sudo journalctl --vacuum-size=500M
Настройка автоматической очистки: Отредактируйте /etc/systemd/journald.conf и установите параметры SystemMaxUse=, SystemKeepFree= или MaxRetentionSec=. После изменений перезапустите службу: sudo systemctl restart systemd-journald.
Проблема: Не могу найти логи по старому имени файла (например, /var/log/syslog)
Причина: В systemd-системах традиционные логи могут быть перенаправлены в journald или отключены. Файлы в /var/log/ могут быть символическими ссылками или не обновляться.
Решение: Используйте journalctl как основной инструмент. Если нужно сохранить логи в классическом виде для внешних систем, настройте systemd-journald на转发 (forwarding) в /var/log/ через параметр ForwardToSyslog=yes в конфиге и запустите rsyslog или syslog-ng.