MAATRIX / Блог / Ротация логов через logrotate

Ротация логов через logrotate

Блог MAATRIX · 2026-07-07

Логи растут незаметно, пока однажды df -h не покажет 100% и сервер не начнёт падать. logrotate решает это: режет логи по расписанию, сжимает старые, удаляет просроченные. Настроим собственное правило для лога приложения — с ротацией, сжатием и корректным перезапуском сервиса.

Зачем это нужно

['Переполненный диск — одна из самых частых причин внезапного отказа сервера: перестают писаться логи, падают базы, отказывает веб-сервер. logrotate предотвращает это, автоматически управляя размером и количеством лог-файлов.', 'В большинстве дистрибутивов он уже установлен и запускается кроном или systemd-таймером ежедневно. Проверить наличие:', '
logrotate --version\nsystemctl status logrotate.timer
', 'На ежедневных бэкапах MAATRIX аккуратная ротация особенно важна: раздутые логи не должны попадать в резервные копии и раздувать их.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS под приложение

Как устроен logrotate

['Глобальный конфиг — /etc/logrotate.conf, а правила для отдельных программ лежат в /etc/logrotate.d/. Свои приложения удобно описывать именно там — отдельным файлом, не трогая системные.', 'logrotate ничего не делает мгновенно: он запускается по таймеру и проверяет условия (частота, размер). Ротация происходит, когда подходит время или файл превысил порог.']

Правило для лога приложения

['Создаём файл /etc/logrotate.d/myapp с правилом. Логи режем ежедневно, храним 14 архивов, сжимаем и не падаем, если лога временно нет:', '
/var/log/myapp/*.log {\n    daily\n    rotate 14\n    missingok\n    notifempty\n    compress\n    delaycompress\n    copytruncate\n    dateext\n    su root root\n}
', 'Разберём ключевые директивы:', "
  • daily / rotate 14 — ротация раз в сутки, храним 14 поколений (две недели).
  • compress — старые логи gzip'уются; delaycompress откладывает сжатие на один цикл (удобно, если процесс ещё пишет в свежеповёрнутый файл).
  • copytruncate — копирует лог и обнуляет исходный на месте; подходит для приложений, которые не умеют переоткрывать файл по сигналу.
  • missingok / notifempty — не ругаться, если лога нет, и не ротировать пустой.
  • dateext — добавлять дату в имя архива вместо номера.
"]

Вариант с перезапуском по сигналу

['Если приложение умеет переоткрывать лог по сигналу (nginx, многие демоны) — вместо copytruncate используют postrotate. Это чище: без момента, когда пишут в уже скопированный файл.', '
/var/log/myapp/*.log {\n    daily\n    rotate 14\n    compress\n    delaycompress\n    missingok\n    notifempty\n    sharedscripts\n    postrotate\n        systemctl reload myapp > /dev/null 2>&1 || true\n    endscript\n}
', 'Директива sharedscripts гарантирует, что postrotate выполнится один раз для всех файлов правила, а не по разу на каждый.']

Проверка без ожидания таймера

['Не нужно ждать сутки — прогоните правило вручную. Флаг -d показывает, что logrotate сделал бы, ничего не меняя (dry-run):', '
sudo logrotate -d /etc/logrotate.d/myapp
', 'Реальный запуск с принудительной ротацией:', '
sudo logrotate -f /etc/logrotate.d/myapp\nls -lh /var/log/myapp/
']

Частые ошибки

['
  • parse error — забыли фигурную скобку или точку с запятой; всегда проверяйте через logrotate -d.
  • Логи не сжимаются — включён delaycompress, первый архив всегда без сжатия, это норма.
  • Приложение продолжает писать в старый файл — оно держит дескриптор; используйте copytruncate или postrotate с reload.
  • Права: если каталог логов принадлежит не root, добавьте директиву su <user> <group>.
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS под приложение

Частые вопросы

copytruncate или postrotate — что выбрать?

Умеет ли приложение переоткрывать лог по сигналу — берите postrotate с reload. Не умеет — copytruncate, но есть крошечное окно, где записи могут потеряться.

Как ротировать по размеру, а не по дням?

Замените daily на size 100M — logrotate повернёт файл, как только он превысит 100 МБ, независимо от даты.

Куда смотреть, если ротация не идёт?

Проверьте systemctl status logrotate.timer и файл состояния /var/lib/logrotate/status — там дата последней ротации каждого лога.