logrotate

logrotate — стандартная утилита Linux для:
— ротации лог-файлов
— сжатия
— хранения истории
— управления размером логов
— Запускается автоматически (cron или systemd timer), обычно раз в день.

Где находятся конфиги

Основной конфиг:
/etc/logrotate.conf

Конфиги отдельных сервисов:
/etc/logrotate.d/*

Обычно один файл = один сервис или группа логов

Базовый пример конфига
/var/log/app.log {
    weekly
    rotate 12
    missingok
    notifempty
    compress
    delaycompress
    create 640 app app
    postrotate
        systemctl kill -s HUP app.service
    endscript
}
Основные директивы

Частота ротации:
daily | weekly | monthly

Сколько хранить:
rotate N
Практика:
4 → ~1 месяц (мало)
12 → ~3 месяца (нормально)
26 → ~6 месяцев
52 → ~1 год (аудит)

Сжатие:
compress — сжимает старые логи
delaycompress — последний лог не сжимается

Защитные опции:
missingok — файла нет → не ошибка
notifempty — файл пустой → не ротируем

Директива create:
create MODE USER GROUP
Пример:
create 640 www-data www-data
Что делает:
создаёт новый лог-файл после ротации
с нужными правами и владельцем
Пользователь и группа должны совпадать с тем, от кого работает сервис.

Зачем нужно переоткрывать лог
Процесс пишет не в файл по имени, а в открытый файловый дескриптор.
Если logrotate переименовал файл или создал новый, то процесс продолжит писать в старый файл, пока его явно не заставить переоткрыть лог.

postrotate и сигнал HUP:

postrotate
    systemctl kill -s HUP app.service
endscript

Даёт команду процессу закрыть старый лог и открыть новый.

Важное правило: create и HUP

Если сервис сам НЕ создаёт лог, нужно обязательно:
create — создать новый файл
postrotate — заставить сервис переоткрыть лог
Иначе новый лог будет пустой, а данные продолжат записываться в старый .log.1

Если сервис сам управляет логом:
— сервис сам создаёт лог-файл
— переоткрывает лог при HUP
— лог пишется через другой процесс
В этом случае create может быть не нужен, а HUP зависит от того, кто держит файл открытым.

Когда HUP НЕ нужен:

— Используется copytruncate (файл не переименовывается, просто копируется и fd остаётся прежним)
— Файл открывается на каждую запись
— Лог пишет внешний логгер
— У приложения свой механизм ротации.

copytruncate — крайний случай

Плюс:
— не нужен HUP
Минус:
— возможна потеря строк

Проверка и отладка

Проверка без изменений

logrotate -d /etc/logrotate.conf

Принудительная ротация

logrotate -f /etc/logrotate.conf

История ротаций

cat /var/lib/logrotate/status
Прокрутить вверх