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