logrotate — CLI-утилита + cron/systemd-timer, автоматически архивирующая старые лог-файлы, чтобы `/var/log/nginx/access.log` не разросся до 100 ГБ. Конфиги — `/etc/logrotate.conf` (глобальный) + `/etc/logrotate.d/*` (per-приложение).
Типичный конфиг для nginx (`/etc/logrotate.d/nginx`): `/var/log/nginx/*.log { daily; rotate 14; compress; delaycompress; missingok; notifempty; sharedscripts; postrotate; /usr/bin/kill -USR1 $(cat /var/run/nginx.pid); endscript; }`. Разбор: ежедневно, хранить 14 копий, сжимать gzip, но не последнюю (чтобы tail -f работал), тихо если нет файла, послать nginx SIGUSR1 для reopen лога.
Ключевые директивы: `daily`/`weekly`/`monthly`/`size 100M`, `rotate N` — сколько хранить, `compress`/`nocompress`, `dateext` — суффикс `-YYYYMMDD` вместо `.1`, `copytruncate` — копия + обнуление (когда приложение не умеет reopen без рестарта — БД в дев-режиме, кастомные скрипты).
Ошибки: (1) забыли `postrotate kill -USR1` — приложение продолжает писать в старый (уже переименованный) файл inodes → диск заполняется. (2) `copytruncate` на sqlite/postgres → race condition, потеря записей. (3) забыли `delaycompress` + `tail -f` — скрипт мониторинга плюётся.
Современно: для приложений на systemd — использовать stdout + journald (лимиты через `SystemMaxUse`), забыть про файлы. logrotate — legacy, но для nginx/postgres по-прежнему рабочая лошадка.