LinuxСредняя

Анализ системных логов в Linux с помощью journalctl

В этом гайде вы научитесь использовать journalctl — мощный инструмент для просмотра и анализа журналов systemd. Вы узнаете, как фильтровать логи по времени, службе или сообщению, отслеживать события в реальном времени и экспортировать данные для дальнейшего изучения.

Обновлено 16 февраля 2026 г.
15-30 мин
Низкая
FixPedia Team
Применимо к:systemd 209+Ubuntu 16.04+CentOS 7+Debian 8+

Введение / Зачем это нужно

Journalctl — это утилита для просмотра и управления журналами systemd, которая заменяет классические системные логи (syslog). Она собирает сообщения от ядра, служб и пользовательских приложений в единый бинарный журнал, обеспечивая централизованный и структурированный доступ к логам Linux.

С помощью этого гайда вы сможете:

  • Быстро находить причины сбоев служб.
  • Отслеживать события в реальном времени.
  • Фильтровать огромные объемы логов по времени, службе или уровню важности.
  • Экспортировать данные для анализа в сторонних инструментах.

Это навык критически важен для системных администраторов, разработчиков и любого, кто работает с Linux-серверами.

Требования / Подготовка

Перед началом убедитесь, что:

  1. Ваша система использует systemd (проверьте командой pidof systemd). Практически все современные дистрибутивы (Ubuntu, CentOS, Debian, Fedora) используют systemd по умолчанию.
  2. У вас есть доступ к терминалу с правами обычного пользователя. Для просмотра логов некоторых служб или очистки журнала могут потребоваться права sudo.
  3. Установлен пакет 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

Проверка результата

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

  1. Временные диапазоны соответствуют ожиданиям (проверьте первые и последние строки).
  2. Фильтр по службе (-u) возвращает логи именно этой службы (ищите её имя в выводе).
  3. При использовании -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.

Часто задаваемые вопросы

Как показать последние 100 строк логов?
Как фильтровать логи только по конкретной службе?
Как искать в логах конкретное слово или ошибку?
Как следить за логами в реальном времени, как с `tail -f`?

Полезное

Просмотр всего журнала
Фильтрация по времени
Поиск по службе systemd
Мониторинг в реальном времени
Экспорт логов в файл