logrotate по расписанию переименовывает текущий лог, сжимает старые и удаляет самые давние. Для системных пакетов (nginx, apt, базы данных) правила уже есть в /etc/logrotate.d. Для своего приложения правило нужно написать самим.
Как он запускается
В Ubuntu и Debian 12 logrotate запускается раз в сутки таймером systemd:
$ systemctl list-timers logrotate.timerПравило для своего приложения
/var/log/myapp/*.log { daily rotate 14 compress delaycompress missingok notifempty create 0640 deploy deploy sharedscripts postrotate systemctl reload myapp >/dev/null 2>&1 || true endscript}- daily и rotate 14 — ротация раз в день, хранить 14 архивов.
- compress и delaycompress — сжимать архивы, но последний оставить несжатым: приложение может ещё дописывать в него.
- missingok и notifempty — не ругаться на отсутствующий файл и не ротировать пустой.
- create — создать новый файл с указанными правами и владельцем.
- postrotate — команда, чтобы приложение открыло новый файл. Если приложение этого не умеет, уберите блок и добавьте copytruncate.
Проверьте результат
Режим отладки покажет, что сделал бы logrotate, ничего не меняя. Флаг -f выполнит ротацию сразу:
$ logrotate -d /etc/logrotate.d/myapp$ logrotate -f /etc/logrotate.d/myapp$ ls -lh /var/log/myapp/Частые ошибки
- «because parent directory has insecure permissions» — каталог с логами доступен на запись группе или всем. Добавьте в правило строку su deploy deploy или исправьте права каталога.
- После ротации лог пустой, а приложение пишет в архив — не настроен postrotate и нет copytruncate.
- Логи Docker-контейнеров logrotate не касаются: для них задают max-size в настройках драйвера логов.