sadrix logoSadriX
Минцифры готовит обязательную регистрацию IMEI смартфонов, купленных за границей
Гайды

Как смотреть логи сервисов через journalctl: полное руководство

Пошаговая инструкция по просмотру и анализу системных логов в Linux с помощью journalctl

09 322 просмотров5 мин
0
Поделиться:TelegramVK

Введение

В современных Linux-дистрибутивах systemd управляет не только сервисами, но и собирает их логи в централизованное хранилище — журнал (journal). Для доступа к нему используется утилита journalctl. Она позволяет просматривать сообщения ядра, системных служб и приложений, фильтровать их по множеству параметров и отслеживать в реальном времени.

Это руководство поможет вам освоить journalctl от базовых команд до продвинутой фильтрации. Вы научитесь быстро находить причину сбоя сервиса, отслеживать ошибки и настраивать хранение логов.

Требования

  • Linux-система с systemd (Ubuntu, Debian, CentOS, Fedora, Arch и др.).

  • Доступ к терминалу с правами обычного пользователя (для некоторых команд потребуется sudo).

  • Базовое знакомство с командной строкой.

  • Установленный пакет systemd-journald (обычно входит в состав systemd).

Шаг 1: Проверка доступности journalctl

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

journalctl --version

Команда выведет версию systemd. Если утилита отсутствует, установите пакет systemd через менеджер пакетов вашего дистрибутива.

Также проверьте, что служба journald запущена:

systemctl status systemd-journald

Если служба неактивна, запустите её:

sudo systemctl start systemd-journald
sudo systemctl enable systemd-journald

Шаг 2: Просмотр всех логов

Самая простая команда — journalctl без аргументов. Она выводит весь журнал, начиная с самых старых записей. Вывод открывается в пейджере less, где можно прокручивать стрелками, искать по / и выходить по q.

journalctl

Если журнал большой, вывод может занять много времени. Для ускорения используйте фильтры, описанные ниже.

Шаг 3: Просмотр логов конкретного сервиса

Чтобы увидеть сообщения только от определённой службы, используйте опцию -u (или --unit):

journalctl -u nginx.service

Можно указать несколько сервисов через запятую:

journalctl -u nginx.service -u php-fpm.service

Обратите внимание: имя юнита должно быть полным, включая суффикс .service. Для пользовательских юнитов добавьте флаг --user.

Шаг 4: Отслеживание логов в реальном времени

Аналог tail -f — опция -f (follow). Она показывает последние строки и продолжает выводить новые сообщения по мере поступления:

journalctl -u nginx.service -f

Чтобы начать с определённого количества последних строк, добавьте -n, например -n 50:

journalctl -u nginx.service -n 50 -f

Выход из режима — Ctrl+C.

Шаг 5: Фильтрация по времени

journalctl поддерживает гибкие фильтры по дате и времени. Используйте опции --since и --until:

journalctl --since "2025-01-01 10:00:00" --until "2025-01-01 12:00:00"

Можно указывать относительные значения:

journalctl --since "1 hour ago"
journalctl --since today
journalctl --since yesterday --until now

Форматы дат: YYYY-MM-DD HH:MM:SS, today, yesterday, now, а также комбинации вроде -1h, -30min.

Шаг 6: Фильтрация по приоритету

Каждое сообщение имеет уровень важности от 0 (emerg) до 7 (debug). Опция -p позволяет выбрать сообщения с указанным приоритетом и выше:

journalctl -p err

Выведет все ошибки и более критические сообщения. Доступные уровни: emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7).

Можно комбинировать с фильтром по сервису:

journalctl -u nginx.service -p warning

Шаг 7: Поиск по содержимому сообщений

Для поиска по тексту используйте -g (grep) с шаблоном. Это чувствительный к регистру поиск по всем полям сообщения:

journalctl -g "error"

Если нужно игнорировать регистр, добавьте -i:

journalctl -i -g "timeout"

Также можно комбинировать с другими фильтрами:

journalctl -u ssh.service -g "failed"

Шаг 8: Просмотр логов за загрузку

journalctl позволяет просматривать логи текущей или предыдущих загрузок системы. Опция -b показывает журнал текущей загрузки:

journalctl -b

Чтобы посмотреть предыдущую загрузку, укажите отрицательное смещение:

journalctl -b -1

Список всех доступных загрузок:

journalctl --list-boots

Это полезно для диагностики проблем, возникших после перезагрузки.

Шаг 9: Фильтрация по исполняемому файлу и PID

Если вы знаете путь к исполняемому файлу процесса, используйте _EXE:

journalctl _EXE=/usr/sbin/nginx

Для фильтрации по идентификатору процесса — _PID:

journalctl _PID=1234

Эти поля можно комбинировать с другими опциями.

Шаг 10: Форматирование вывода

По умолчанию journalctl выводит записи в коротком формате. Опция -o меняет формат вывода. Популярные варианты:

  • short — стандартный формат (по умолчанию).

  • json — машиночитаемый JSON.

  • json-pretty — JSON с отступами.

  • cat — только сообщение без метаданных.

  • verbose — все поля записи.

Пример:

journalctl -u nginx.service -o json-pretty

Для вывода в реальном времени с JSON используйте -f -o json.

Шаг 11: Ограничение количества строк и прокрутка

Опция -n задаёт число последних строк для вывода:

journalctl -n 100

Если нужно вывести все записи без пейджера, добавьте --no-pager:

journalctl --no-pager -n 50

Это удобно для перенаправления вывода в файл или другую команду.

Шаг 12: Очистка журнала и управление размером

Со временем журнал может занимать много места. Проверить текущий размер:

journalctl --disk-usage

Очистить старые записи до определённого размера:

sudo journalctl --vacuum-size=500M

Или удалить записи старше определённого срока:

sudo journalctl --vacuum-time=2weeks

Можно оставить только определённое количество файлов:

sudo journalctl --vacuum-files=5

Шаг 13: Настройка постоянного хранения логов

По умолчанию journald может хранить логи только в оперативной памяти (в /run/log/journal), и они теряются при перезагрузке. Для постоянного хранения включите сохранение на диск:

1. Создайте каталог:

sudo mkdir -p /var/log/journal

2. Установите права:

sudo systemd-tmpfiles --create --prefix /var/log/journal

3. Перезапустите journald:

sudo systemctl restart systemd-journald

Теперь логи будут сохраняться в /var/log/journal и доступны после перезагрузки.

Шаг 14: Просмотр логов ядра

Для сообщений ядра используйте опцию -k (или --dmesg):

journalctl -k

Это аналог команды dmesg, но с возможностью фильтрации по времени и приоритету.

Типичные ошибки

  • Забыли указать `.service` — journalctl не найдёт юнит, если имя неполное. Всегда используйте полное имя, например nginx.service.

  • Недостаточно прав — для просмотра логов некоторых сервисов или системных сообщений может потребоваться sudo.

  • Логи не сохраняются после перезагрузки — по умолчанию journald хранит данные в памяти. Включите постоянное хранение (шаг 13).

  • Слишком большой вывод — используйте фильтры по времени, сервису и приоритету, чтобы сузить круг поиска.

  • Ошибка «Failed to add match» — проверьте синтаксис фильтра, например _EXE должен быть с большой буквы.

  • journalctl не показывает старые логи — возможно, они были удалены из-за ограничения размера. Проверьте настройки в /etc/systemd/journald.conf.

FAQ

В: Чем journalctl отличается от просмотра файлов в /var/log? О: journalctl предоставляет единый интерфейс к структурированным логам systemd, с мощной фильтрацией и метаданными. Традиционные файлы в /var/log могут содержать логи приложений, не интегрированных с systemd.

В: Как посмотреть логи только за последний час? О: Используйте journalctl --since "1 hour ago".

В: Можно ли экспортировать логи в файл? О: Да, например: journalctl -u nginx.service > nginx.log или с JSON: journalctl -o json > logs.json.

В: Как узнать, какие сервисы пишут в journal? О: Выполните journalctl -F _SYSTEMD_UNIT — команда выведет список всех юнитов, присутствующих в журнале.

В: Что делать, если journalctl показывает «No journal files were found»? О: Проверьте, запущена ли служба systemd-journald, и есть ли права на чтение. Возможно, логи хранятся только в памяти и были очищены.

В: Как настроить ротацию логов? О: Отредактируйте /etc/systemd/journald.conf, параметры SystemMaxUse, SystemMaxFileSize, MaxRetentionSec. После изменений перезапустите journald.

Итог

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

Читайте также

Комментарии

Комментарии доступны только зарегистрированным пользователям. Войти

  • Пока нет комментариев. Будьте первым.