journalctl и logrotate: как читать и ротировать логи в Linux
Практика4 минРедакция Innovialabs
Коротко
Логи 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, из-за которых приложение не может писать в новый файл.
Чтобы диск не переполнялся
- Лимит для journal в
journald.conf. - Правило logrotate для каждого файла, который пишет ваше приложение.
- Ротация логов Docker-контейнеров в настройках драйвера логирования.
- Мониторинг свободного места с оповещением заранее, а не при полном диске.