journalctl для чайников: работаем с логами systemd

Systemd — это система инициализации, которая используется в большинстве современных дистрибутивов Linux. Одной из её важных функций является ведение системных журналов через специальный компонент под названием journald. Команда journalctl позволяет работать с этими журналами. В этой статье мы рассмотрим, как использовать journalctl для диагностики и анализа системных логов.

Что такое journald и journalctl?

Journald — это компонент systemd, который собирает и хранит логи в бинарном формате. В отличие от традиционных текстовых логов в /var/log, journald хранит дополнительную структурированную информацию о каждом сообщении, включая:

  • Время с точностью до микросекунд
  • PID процесса
  • UID и GID пользователя
  • Код возврата
  • Дополнительные поля данных

Команда journalctl — это инструмент командной строки для просмотра и фильтрации этих журналов.

Основные команды journalctl

Просмотр всех логов

bash journalctl

Показывает все доступные логи, начиная с самых старых. Используйте клавиши со стрелками для навигации или q для выхода.

Просмотр последних логов

bash journalctl -n 20

Показывает последние 20 записей. По умолчанию показываются последние 10.

Просмотр логов с "живым" обновлением

bash journalctl -f

Аналогично tail -f для традиционных логов. Показывает последние записи и продолжает отображать новые по мере их появления.

Фильтрация по времени

Просмотр логов за сегодня

bash journalctl --today

Просмотр логов за конкретную дату

bash journalctl --since "2026-03-03" journalctl --until "2026-03-03"

Просмотр логов за определенный период

bash journalctl --since "2026-03-01" --until "2026-03-03"

Просмотр логов за последние N минут/часов

bash journalctl --since "2 hours ago" journalctl --since "30 minutes ago"

Фильтрация по сервису

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

bash journalctl -u nginx.service journalctl -u ssh.service

Просмотр логов сервиса за определенный период

bash journalctl -u nginx.service --since "2026-03-03 10:00:00"

Фильтрация по уровню важности

Journalctl позволяет фильтровать сообщения по уровню важности (priority):

```bash

Показать только ошибки

journalctl -p err

Показать ошибки и критические сообщения

journalctl -p crit

Показать все сообщения с уровнем ниже указанного

journalctl -p info ```

Доступные уровни: - 0/emerg: Чрезвычайная ситуация - 1/alert: Тревога - 2/crit: Критическая ошибка - 3/err: Ошибка - 4/warning: Предупреждение - 5/notice: Заметка - 6/info: Информация - 7/debug: Отладка

Фильтрация по процессу и пользователю

Просмотр логов по PID процесса

bash journalctl _PID=1234

Просмотр логов по пользователю

bash journalctl _UID=1000

Просмотр логов по команде

bash journalctl _COMM=systemd

Практические примеры использования

Поиск ошибок в системе

```bash

Показать все ошибки за последние 24 часа

journalctl --since "24 hours ago" -p err..alert

Показать все сообщения об ошибках ядра

journalctl -k ```

Анализ проблем с загрузкой

```bash

Просмотр логов текущей загрузки

journalctl -b

Просмотр логов предыдущей загрузки

journalctl -b -1

Просмотр логов конкретной загрузки по UUID

journalctl -b 12345678-1234-1234-1234-123456789abc ```

Поиск по ключевым словам

```bash

Поиск по ключевому слову

journalctl | grep "error"

Поиск в логах конкретного сервиса

journalctl -u nginx.service | grep "404" ```

Форматы вывода

Journalctl поддерживает различные форматы вывода:

```bash

JSON формат

journalctl -o json

Краткий формат

journalctl -o short

Полный формат

journalctl -o verbose

Кастомный формат

journalctl -o export ```

Управление размером журнала

Проверка размера журнала

bash journalctl --disk-usage

Очистка старых журналов

```bash

Удалить журналы старше 7 дней

journalctl --vacuum-time=7d

Ограничить размер журнала 100MB

journalctl --vacuum-size=100M

Оставить только N архивов

journalctl --vacuum-files=3 ```

Настройка постоянного хранения журналов

По умолчанию journald хранит логи только в /run/log/journal, что означает, что они будут потеряны при перезагрузке. Чтобы сохранить логи постоянно:

  1. Создайте директорию: bash sudo mkdir -p /var/log/journal

  2. Добавьте в /etc/systemd/journald.conf: [Journal] Storage=persistent

  3. Перезапустите journald: bash sudo systemctl restart systemd-journald

Практические советы

Сохранение результатов в файл

```bash

Сохранить результаты в файл

journalctl -u nginx.service --since "2026-03-03" > nginx_logs.txt

Сохранить в JSON формате

journalctl -u nginx.service --since "2026-03-03" -o json > nginx_logs.json ```

Мониторинг в реальном времени с фильтрацией

```bash

Мониторинг логов SSH в реальном времени

journalctl -u ssh.service -f

Мониторинг ошибок ядра в реальном времени

journalctl -k -f ```

Сравнение логов до и после изменений

```bash

Отметить время перед изменением

MARK_START=$(date +"%Y-%m-%d %H:%M:%S")

Выполнить изменения

systemctl restart nginx

Просмотреть логи после изменений

journalctl --since "$MARK_START" -u nginx.service ```

Заключение

Команда journalctl — мощный инструмент для диагностики и анализа системных логов в современных Linux-системах. Благодаря своей гибкости и богатым возможностям фильтрации, она позволяет быстро находить проблемы и анализировать поведение системы. Освоение journalctl — важный навык для любого системного администратора, работающего с современными дистрибутивами Linux.

Помните, что journald дополняет, а не заменяет традиционные логи в /var/log. Многие приложения продолжают записывать логи в традиционные файлы, поэтому знание обоих подходов необходимо для эффективной диагностики систем.