Ротация логов через logrotate
Логи растут незаметно, пока однажды 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 — там дата последней ротации каждого лога.