Ротация логов через logrotate
Логи растут незаметно, пока однажды df -h не покажет 100% и сервер не начнёт падать. logrotate решает это: режет логи по расписанию, сжимает старые, удаляет просроченные. Настроим собственное правило для лога приложения — с ротацией, сжатием и корректным перезапуском сервиса.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Зачем это нужно
Переполненный диск — одна из самых частых причин внезапного отказа сервера: перестают писаться логи, падают базы, отказывает веб-сервер. logrotate предотвращает это, автоматически управляя размером и количеством лог-файлов.
В большинстве дистрибутивов он уже установлен и запускается кроном или systemd-таймером ежедневно. Проверить наличие:
logrotate --version
systemctl 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 {
daily
rotate 14
missingok
notifempty
compress
delaycompress
copytruncate
dateext
su root root
}
Разберём ключевые директивы:
- daily / rotate 14 — ротация раз в сутки, храним 14 поколений (две недели).
- compress — старые логи gzip'уются; delaycompress откладывает сжатие на один цикл (удобно, если процесс ещё пишет в свежеповёрнутый файл).
- copytruncate — копирует лог и обнуляет исходный на месте; подходит для приложений, которые не умеют переоткрывать файл по сигналу.
- missingok / notifempty — не ругаться, если лога нет, и не ротировать пустой.
- dateext — добавлять дату в имя архива вместо номера.
Вариант с перезапуском по сигналу
Если приложение умеет переоткрывать лог по сигналу (nginx, многие демоны) — вместо copytruncate используют postrotate. Это чище: без момента, когда пишут в уже скопированный файл.
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
Директива sharedscripts гарантирует, что postrotate выполнится один раз для всех файлов правила, а не по разу на каждый.
Проверка без ожидания таймера
Не нужно ждать сутки — прогоните правило вручную. Флаг -d показывает, что logrotate сделал бы, ничего не меняя (dry-run):
sudo logrotate -d /etc/logrotate.d/myapp
Реальный запуск с принудительной ротацией:
sudo logrotate -f /etc/logrotate.d/myapp
ls -lh /var/log/myapp/
Частые ошибки
- parse error — забыли фигурную скобку или точку с запятой; всегда проверяйте через logrotate -d.
- Логи не сжимаются — включён delaycompress, первый архив всегда без сжатия, это норма.
- Приложение продолжает писать в старый файл — оно держит дескриптор; используйте copytruncate или postrotate с reload.
- Права: если каталог логов принадлежит не root, добавьте директиву su <user> <group>.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS под приложениеОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
copytruncate или postrotate — что выбрать?
Умеет ли приложение переоткрывать лог по сигналу — берите postrotate с reload. Не умеет — copytruncate, но есть крошечное окно, где записи могут потеряться.
Как ротировать по размеру, а не по дням?
Замените daily на size 100M — logrotate повернёт файл, как только он превысит 100 МБ, независимо от даты.
Куда смотреть, если ротация не идёт?
Проверьте systemctl status logrotate.timer и файл состояния /var/lib/logrotate/status — там дата последней ротации каждого лога.