linux-labs

Вики / Логи и аудит

logrotate (ротация логов)

Концепция Ubuntu 24.04 ЛогиХранилище

Чтобы логи не съели диск — ротация, сжатие, хранение; проверка конфигов.

Текстовые логи в /var/log (nginx, apache, кастомные) растут и могут забить диск. logrotate периодически переименовывает, сжимает и удаляет старые логи. Запускается по systemd-таймеру (logrotate.timer).

Журнал systemd (journalctl) ротируется отдельно (своими лимитами), logrotate его не трогает.

Глобально — /etc/logrotate.conf, по сервисам — /etc/logrotate.d/<service>:

/var/log/myapp/*.log {
    daily                 # как часто (daily/weekly/monthly) — или size 100M
    rotate 14             # хранить 14 копий
    compress              # сжимать старые (.gz)
    delaycompress         # не сжимать самый свежий ротированный (для дозаписи)
    missingok             # ок, если лога нет
    notifempty            # не ротировать пустые
    dateext               # суффикс датой (file-20260101) вместо .1
    create 0640 myapp myapp   # создать новый лог с этими правами/владельцем
    su myapp myapp            # под кем работать (если каталог не root)
    sharedscripts             # postrotate один раз на все файлы шаблона
    postrotate
        systemctl reload myapp >/dev/null 2>&1 || true
    endscript
}
Директива Смысл
daily/weekly/monthly период
size 100M ротация по размеру (вместо/вместе с периодом)
rotate N сколько копий хранить
compress/delaycompress сжимать / отложить сжатие на цикл
copytruncate копировать и обнулить (если служба не умеет переоткрыть лог)
postrotate…endscript команда после ротации (reload службы)
maxage N удалять старше N дней

postrotate (reload/переоткрытие) или copytruncate нужны, чтобы служба начала писать в новый файл.

sudo logrotate -d /etc/logrotate.conf     # debug/dry-run: что БЫ сделал (ничего не меняет)
sudo logrotate -v /etc/logrotate.conf     # verbose-прогон
sudo logrotate -f /etc/logrotate.d/nginx  # ФОРСИРОВАТЬ ротацию сейчас
cat /var/lib/logrotate/status             # когда что ротировалось последний раз
systemctl status logrotate.timer          # активен ли таймер

Лог растёт, ротации нет

  • Конфиг в /etc/logrotate.d/? logrotate -d (dry-run) покажет, попадает ли файл.
  • Таймер активен? systemctl status logrotate.timer.
  • Ошибка в одном конфиге блокирует остальные — смотри вывод -d/journalctl -u logrotate.

После ротации служба пишет в старый (удалённый) файл

Нет postrotate с reload или copytruncate. Служба держит старый дескриптор — место не освобождается (см. disk-usage: lsof +L1). Добавь reload или copytruncate.

«error: skipping … because parent directory has insecure permissions»

logrotate ругается на права/владельца каталога логов. Добавь su user group в блок.

Диск уже забит логами

Срочно: вручную logrotate -f, поджать/удалить старое; затем настроить ротацию и лимиты (disk-usage).

sudo logrotate -d CONFIG          # dry-run (ничего не меняет)
sudo logrotate -f /etc/logrotate.d/nginx   # форсировать сейчас
cat /var/lib/logrotate/status     # история ротаций
# блок: daily|size / rotate N / compress / postrotate reload (или copytruncate) / su user group

См. также