Tedval

Ротация логов: три значения, которые стоит поменять в первый день

9 июля 2026

Диск на маленьком сервере кончается не от данных, а от логов. Причём происходит это тихо: сервис продолжает работать, пока свободного места не останется совсем, а потом падает сразу всё, включая то, чем вы собирались чинить.

Логи контейнеров

Драйвер json-file по умолчанию не ограничен вообще ничем. Контейнер, который пишет пару строк в секунду, за месяц спокойно набирает несколько гигабайт, и никакой logrotate к ним не применяется — это отдельная подсистема.

Лечится в compose-файле каждого сервиса:

logging:
  driver: json-file
  options:
    max-size: 30m
    max-file: "5"

Либо глобально, в /etc/docker/daemon.json, если не хочется дублировать в каждом файле. Учтите, что глобальная настройка применится только к новым контейнерам: уже созданные останутся со старыми параметрами до пересоздания.

Посмотреть, сколько занято сейчас:

du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail

Системные логи

У journald своя логика: он ограничивает себя долей от размера файловой системы, по умолчанию около десяти процентов. На диске в двадцать пять гигабайт это два с половиной гигабайта журналов, что многовато. Разумно задать явный потолок:

[Journal]
SystemMaxUse=300M
MaxRetentionSec=14day

Файл /etc/systemd/journald.conf.d/limits.conf, затем systemctl restart systemd-journald. Освободить место немедленно можно командой journalctl --vacuum-size=200M.

Логи nginx

Здесь правила уже есть, но стоит проверить два момента. Первое — compress, без него старые файлы лежат в исходном виде и занимают в несколько раз больше. Второе — rotate, число хранимых копий: четырнадцать по умолчанию редко нужно, семи обычно достаточно.

Проверить, что правила действительно применяются:

logrotate -d /etc/logrotate.d/nginx

Флаг -d показывает, что было бы сделано, ничего не меняя. Полезно, когда правила правились руками и есть сомнения в синтаксисе.

Одна проверка вместо трёх

Всё перечисленное сводится к одному вопросу: сколько места осталось. Проверка занимает строчку и стоит того, чтобы висеть в мониторинге:

df -h / | awk 'NR==2 {print $5}'

Алерт на восьмидесяти процентах даёт запас в несколько дней даже при активной записи. Этого хватает, чтобы разобраться без спешки — а спешка при кончившемся диске обычно заканчивается удалением не того файла.

← Дешёвые проверки доступности Nginx буферизует →