# Логи systemd: journalctl, rsyslog і ліміт розміру

> journalctl і rsyslog читають логи systemd та обмежують їхній розмір: команди, параметри journald.conf і налаштування ротації.

## Як влаштовані логи в 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](https://www.zevshost.net/uk/kb/nastroit-logrotate/). Без ротації файл на кшталт `/var/log/nginx/access.log` за місяць виростає до десятків гігабайт на навантаженому сервері.

## Дії за заповнення диска логами

Коли місце на диску закінчується саме через логи, спершу знаходять винуватця:

```
journalctl --disk-usage
du -sh /var/log/* | sort -rh | head -10
```

Далі — або скорочення журналу командою `journalctl --vacuum-size`, або налаштування ротації для конкретного файлу. Загальний підхід до пошуку пожирача місця на диску розібрано у статті [про діагностику заповненого диска](https://www.zevshost.net/uk/kb/disk-zapolnen-diagnostika/).

## Підсумок: чек-лист щодо логів

- Логи дивляться через `journalctl -u ім'я_служби` та `journalctl -f`.
- Розмір журналу обмежують у `/etc/systemd/journald.conf`: `SystemMaxUse` і `MaxRetentionSec`.
- Для текстових логів налаштовують правила rsyslog у `/etc/rsyslog.d/`.
- Для файлів rsyslog підключають ротацію logrotate.
- Періодично перевіряють `journalctl --disk-usage`, щоб журнал не забив диск.

---

Джерело: https://www.zevshost.net/uk/kb/journalctl-rsyslog-logi/
