Как устроены логи в systemd: journald и rsyslog
На современных дистрибутивах Linux (Ubuntu, Debian, CentOS, Rocky Linux, AlmaLinux) логи собирает systemd-journald — служба, которая перехватывает вывод всех unit-файлов, ядра и системных сообщений в единый бинарный журнал. Читать его напрямую нельзя — только через утилиту journalctl. Часть систем дополнительно использует rsyslog, который берёт данные из journald и раскладывает их по текстовым файлам вроде /var/log/syslog или /var/log/messages.
Без ограничения бинарный журнал journald способен незаметно вырасти до нескольких гигабайт и занять всё место на диске. Разберём чтение логов, установку лимита и связку journald с rsyslog.
Основные команды journalctl
Частые сценарии работы с журналом:
journalctl -xe
journalctl -u nginx.service
journalctl -f
journalctl --since "1 hour ago"
journalctl -p err
journalctl --disk-usage
journalctl -xe показывает последние записи с расшифровкой ошибок, -u фильтрует по конкретной службе, -f работает как tail -f в реальном времени, а --disk-usage сразу показывает объём журнала на диске.
Ограничение размера журнала journald
Настройки хранения задаются в файле /etc/systemd/journald.conf. Основные параметры:
| Параметр | Назначение |
|---|---|
SystemMaxUse | максимальный размер журнала на диске |
SystemKeepFree | объём места, остающийся свободным |
MaxRetentionSec | максимальный срок хранения записей |
Storage | режим хранения: auto, persistent, volatile |
Пример ограничения журнала в 200 мегабайт со сроком хранения 14 дней:
SystemMaxUse=200M
MaxRetentionSec=14day
После правки конфигурации служба перезапускается:
systemctl restart systemd-journald
Текущий размер журнала на диске проверяется командой journalctl --disk-usage, а принудительная очистка старых записей выполняется через journalctl --vacuum-size=200M или journalctl --vacuum-time=14d.
Настройка rsyslog для текстовых логов
rsyslog пригождается, когда логи требуется смотреть без journalctl — например, для сторонних скриптов парсинга. Конфигурация лежит в /etc/rsyslog.conf и файлах /etc/rsyslog.d/*.conf. Типовое правило, отправляющее сообщения определённой службы в отдельный файл:
if $programname == 'myapp' then /var/log/myapp.log
& stop
После изменения конфигурации служба перезапускается командой systemctl restart rsyslog. Корректность синтаксиса проверяется так: rsyslogd -N1.
Ротация логов: journald и rsyslog
journald сам ограничивает размер по параметрам из journald.conf, а текстовые файлы, которые пишет rsyslog, растут бесконтрольно без внешнего инструмента. За это отвечает logrotate — он сжимает и удаляет старые файлы по расписанию. Подробная настройка описана в статье про logrotate на Linux. Без ротации файл вроде /var/log/nginx/access.log за месяц вырастает до десятков гигабайт на нагруженном сервере.
Действия при заполнении диска логами
Когда место на диске заканчивается именно из-за логов, сначала находят виновника:
journalctl --disk-usage
du -sh /var/log/* | sort -rh | head -10
Дальше — либо сокращение журнала командой journalctl --vacuum-size, либо настройка ротации для конкретного файла. Общий подход к поиску пожирателя места на диске разобран в статье про диагностику заполненного диска.
Итог: чек-лист по логам
- Логи смотрят через
journalctl -u имя_службыиjournalctl -f. - Размер журнала ограничивают в
/etc/systemd/journald.conf:SystemMaxUseиMaxRetentionSec. - Для текстовых логов настраивают правила rsyslog в
/etc/rsyslog.d/. - Для файлов rsyslog подключают ротацию logrotate.
- Периодически проверяют
journalctl --disk-usage, чтобы журнал не забил диск.