Введение / Зачем это нужно
Journalctl — это утилита для просмотра и управления журналами systemd, которая заменяет классические системные логи (syslog). Она собирает сообщения от ядра, служб и пользовательских приложений в единый бинарный журнал, обеспечивая централизованный и структурированный доступ к логам Linux.
С помощью этого гайда вы сможете:
- Быстро находить причины сбоев служб.
- Отслеживать события в реальном времени.
- Фильтровать огромные объемы логов по времени, службе или уровню важности.
- Экспортировать данные для анализа в сторонних инструментах.
Это навык критически важен для системных администраторов, разработчиков и любого, кто работает с Linux-серверами.
Требования / Подготовка
Перед началом убедитесь, что:
- Ваша система использует systemd (проверьте командой
pidof systemd). Практически все современные дистрибутивы (Ubuntu, CentOS, Debian, Fedora) используют systemd по умолчанию. - У вас есть доступ к терминалу с правами обычного пользователя. Для просмотра логов некоторых служб или очистки журнала могут потребоваться права sudo.
- Установлен пакет
systemd(обычно предустановлен).
Базовый просмотр журнала
Шаг 1: Открытие журнала
Просто введите в терминале:
journalctl
По умолчанию вы увидите все записи, начиная с самого старого, с пагинацией (кнопки Page Up/Down для навигации). Для выхода нажмите q.
💡 Совет: Если пагинация мешает, добавьте
--no-pager:journalctl --no-pager. Это выведет весь журнал сразу.
Шаг 2: Просмотр последних записей
Чтобы увидеть самые свежие события (аналог tail -f без слежения), используйте:
journalctl -n 50
Флаг -n (или --lines) показывает указанное количество последних строк. Без числа покажет 10.
Фильтрация логов
Шаг 3: Фильтрация по времени
Очень часто нужно найти логи за конкретный период. Journalctl понимает гибкие форматы даты:
# Логи за сегодня
journalctl --since today
# Логи за последние 2 часа
journalctl --since "2 hours ago"
# Логи между двумя точками во времени
journalctl --since "2024-02-15 09:00:00" --until "2024-02-15 10:00:00"
# Логи за конкретную дату
journalctl --since yesterday --until today
Шаг 4: Фильтрация по службе (юниту)
Если проблема связана с конкретной службой (например, nginx или sshd), фильтруйте по её имени:
journalctl -u nginx.service
journalctl -u sshd --since today
Можно комбинировать с временными фильтрами. Имя юнита можно узнать через systemctl list-units.
Шаг 5: Фильтрация по уровню важности
Журнал systemd помечает сообщения уровнями: debug, info, notice, warning, error, crit, alert, emerg. По умолчанию показываются info и выше.
# Только ошибки и критические сообщения
journalctl -p err..emerg
# Только предупреждения и выше
journalctl -p warning
# Уровень от debug до notice
journalctl -p debug..notice
Короткая запись: journalctl -p 3 (где цифра — код уровня, 0=emerg, 1=alert, 2=crit, 3=err и т.д.).
Шаг 6: Поиск по тексту
Для поиска конкретного слова или фразы в сообщениях:
journalctl | grep "Permission denied"
Или используйте встроенный поиск journalctl (регистрозависимый):
journalctl -g "ошибка подключения"
Флаг -g (или --grep) ищет в поле MESSAGE. Для регистронезависимого поиска добавьте -i: journalctl -gi error.
Расширенные возможности
Шаг 7: Мониторинг в реальном времени
Чтобы видеть новые записи по мере их поступления (как tail -f), используйте:
journalctl -f
Комбинация с фильтрами очень полезна, например: journalctl -u docker -f — слежение только за логами Docker.
Шаг 8: Управление выводом и форматирование
Вы можете настроить формат вывода для скриптов или более читаемого вида:
# Показать только время и сообщение (удобно для grep)
journalctl -o short-iso
# Показать все поля записи в JSON (для парсинга)
journalctl -o json
# Показать только сообщения без метаданных
journalctl -o cat
Шаг 9: Экспорт и сохранение логов
Для архивации или отправки в службу поддержки сохраните журнал в файл:
# Весь журнал
journalctl > full_log.txt
# Часть журнала (например, за последний день по службе cron)
journalctl -u cron --since "1 day ago" > cron_log.txt
# В сжатом виде (сжатие gzip)
journalctl --since "1 week ago" | gzip > weekly_logs.gz
Проверка результата
После выполнения команд вы должны увидеть на экране отфильтрованные записи журнала. Убедитесь, что:
- Временные диапазоны соответствуют ожиданиям (проверьте первые и последние строки).
- Фильтр по службе (
-u) возвращает логи именно этой службы (ищите её имя в выводе). - При использовании
-fновые строки появляются автоматически.
Если вывод пустой, возможно:
- За указанный период записей нет.
- Фильтр слишком строгий (например, неверное имя юнита).
- Уровень важности не включает нужные сообщения.
Возможные проблемы
Проблема 1: "Failed to open journal: Permission denied"
Причина: У вашего пользователя нет прав на чтение всего журнала. Некоторые логи (особенно от ядра или системных служб) доступны только root.
Решение: Используйте sudo перед командой: sudo journalctl -u sshd. Или настройте права через sudo visudo (осторожно!).
Проблема 2: Журнал слишком большой, команда работает медленно
Причина: Journalctl по умолчанию читает весь журнал, который может занимать гигабайты.
Решение: Всегда применяйте фильтры (--since, -u, -p) для ограничения объема. Также можно указать количество строк -n. Для очистки старого журнала: sudo journalctl --vacuum-time=7d (удалит записи старше 7 дней).
Проблема 3: Не вижу логи своей пользовательской программы
Причина: Программа не пишет в systemd-journald (использует свой файл или стандартный вывод).
Решение: Убедитесь, что программа настроена на логирование в stdout/stderr, которые systemd перехватывает. Для демонов проверьте настройки юнита (StandardOutput=journal). Или ищите логи в традиционных местах (/var/log/).
Проблема 4: Команда journalctl -f не показывает новые записи
Причина: Вы запустили -f без фильтра по службе, а новые записи имеют уровень ниже info (например, debug), который по умолчанию подавляется.
Решение: Укажите уровень явно: journalctl -f -p debug или настройте уровень для всей системы через /etc/systemd/journald.conf.