Як влаштовані логи в 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, щоб журнал не забив диск.