Перейти к содержанию
Innovialabs

journalctl и logrotate: как читать и ротировать логи в Linux

Практика4 мин

Коротко

Логи systemd-сервисов читаются через journalctl с фильтрами -u, --since и -p, размер журнала задаётся в journald.conf, а файловые логи в /var/log ротирует logrotate по правилам из /etc/logrotate.d.

Две системы логов в Linux

В современных дистрибутивах логи живут в двух местах:

  • systemd journal — бинарный журнал, который собирает journald: вывод сервисов, сообщения ядра, системные события. Читается командой journalctl.
  • Текстовые файлы в /var/log — классические логи: их пишут rsyslog, Nginx, базы данных и многие приложения. Их размер контролирует logrotate.

Нужно уметь работать с обоими: journal отвечает на вопрос «что случилось», logrotate — за то, чтобы логи не съели диск.

journalctl: фильтр по сервису

journalctl -u nginx              # все записи сервиса
journalctl -u nginx -f           # следить в реальном времени
journalctl -u nginx -n 100       # последние 100 строк
journalctl -u app -u worker      # несколько сервисов сразу
journalctl -b                    # с текущей загрузки
journalctl -b -1                 # с предыдущей загрузки
journalctl -k                    # только сообщения ядра

Флаг -b -1 полезен после внезапной перезагрузки: он показывает, что происходило перед ней (если журнал хранится на диске, см. ниже).

Фильтр по времени и приоритету

journalctl --since "2026-10-01 09:00" --until "2026-10-01 10:00"
journalctl -u app --since "1 hour ago"
journalctl -u app --since today -p err

Флаг -p оставляет записи указанного уровня и более серьёзные. Уровни по возрастанию серьёзности: debug, info, notice, warning, err, crit, alert, emerg. Значит, -p warning покажет предупреждения и все ошибки.

Ещё полезные опции:

  • -o json-pretty или -o cat — другой формат вывода;
  • --no-pager — вывод без постраничного просмотра, удобно для скриптов;
  • -g "timeout" — поиск по тексту сообщения (в достаточно новых версиях systemd).

Ограничение размера журнала

Проверьте, сколько места он занимает:

journalctl --disk-usage

Постоянный лимит задаётся в /etc/systemd/journald.conf (или в отдельном файле в journald.conf.d/):

[Journal]
Storage=persistent
SystemMaxUse=500M
MaxRetentionSec=1month

Затем sudo systemctl restart systemd-journald. Storage=persistent сохраняет журнал на диск между перезагрузками — без этого в некоторых дистрибутивах он хранится только в памяти.

Разовая очистка старых записей:

sudo journalctl --vacuum-size=300M
sudo journalctl --vacuum-time=14d

Где лежат классические логи

ФайлЧто внутри
/var/log/syslog или /var/log/messagesобщий системный лог (Debian/Ubuntu и RHEL-семейство соответственно)
/var/log/auth.log или /var/log/secureвходы, sudo, SSH
/var/log/kern.logсообщения ядра
/var/log/nginx/access.log и error.log веб-сервера
/var/log/apt/, /var/log/dnf.logустановка и обновление пакетов

Найти, что занимает место: sudo du -sh /var/log/* | sort -h.

logrotate: правила ротации

logrotate обычно запускается раз в сутки (через cron или systemd timer) и обрабатывает правила из /etc/logrotate.conf и /etc/logrotate.d/. Пример для логов приложения:

/var/log/myapp/*.log {
    daily
    rotate 14
    maxsize 100M
    missingok
    notifempty
    compress
    delaycompress
    create 0640 myapp myapp
    sharedscripts
    postrotate
        systemctl reload myapp > /dev/null 2>&1 || true
    endscript
}

Что здесь важно:

  • daily / rotate 14 — ротировать раз в день и хранить 14 архивов.
  • maxsize — ротировать раньше срока, если файл вырос. Сработает только при запуске logrotate, поэтому при очень быстром росте запускайте его чаще.
  • compress / delaycompress — сжимать архивы, но последний оставлять несжатым на случай, если процесс ещё в него пишет.
  • postrotate — сообщить приложению, чтобы оно открыло новый файл. Иначе процесс продолжит писать в переименованный файл.
  • copytruncate — альтернатива для приложений, которые не умеют переоткрывать файл. Есть риск потерять несколько строк в момент копирования.

Проверка правил

sudo logrotate -d /etc/logrotate.d/myapp   # сухой прогон, ничего не меняет
sudo logrotate -f /etc/logrotate.d/myapp   # принудительная ротация

Частые ошибки: правило для пути, где файлов нет, без missingok; забытый postrotate; неверные права в create, из-за которых приложение не может писать в новый файл.

Чтобы диск не переполнялся

  1. Лимит для journal в journald.conf.
  2. Правило logrotate для каждого файла, который пишет ваше приложение.
  3. Ротация логов Docker-контейнеров в настройках драйвера логирования.
  4. Мониторинг свободного места с оповещением заранее, а не при полном диске.

Частые вопросы

Скорее всего, журнал хранится только в памяти. Задайте Storage=persistent в journald.conf или создайте каталог /var/log/journal и перезапустите systemd-journald.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

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

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.