Как использовать logrotate для ротации и очистки логов в Linux

8 минут чтения
Средний рейтинг статьи — 4.9

Логи в Linux растут быстро — особенно если речь идёт о веб-серверах, приложениях и системных сервисах. Если их не ограничивать, они могут занять весь диск, привести к сбоям и даже остановке сервисов.
Для автоматического управления логами используется утилита logrotate — стандартный инструмент ротации, архивирования и удаления лог-файлов.

В этой статье разберём, как работает logrotate, как он обрабатывает логи, где хранится конфигурация и как настроить ротацию для любого сервиса.

Что такое logrotate и зачем он нужен

logrotate — утилита, которая:

  • автоматически ротирует логи (создаёт новые файлы, старые переименовывает);
  • сжимает их в архивы (gzip, bzip2);
  • удаляет старые файлы по сроку;
  • ограничивает размер логов;
  • выполняет дополнительные команды до/после ротации.

Она запускается по cron (/etc/cron.daily/logrotate) или через systemd-таймер, в зависимости от дистрибутива.

Где хранятся конфигурации logrotate

Logrotate использует два типа конфигов:

Основной конфиг

/etc/logrotate.conf

Обычно задаёт глобальные настройки: периодичность, компрессию, количество хранимых архивов и т.д.

Конфиги сервисов

/etc/logrotate.d/

Каждый файл в этой директории — отдельная политика ротации (nginx, apache2, mysql и т.д.).

Пример простой конфигурации

Допустим, нужно ротировать файл:

/var/log/myapp/app.log

Создаём конфиг:

/etc/logrotate.d/myapp

/var/log/myapp/app.log {
    weekly
    rotate 4
    compress
    missingok
    notifempty
    create 0640 root adm
}

Разбор параметров:

  • weekly — ротация раз в неделю.
  • rotate 4 — хранить 4 архива.
  • compress — архивировать старые файлы в .gz.
  • missingok — не ругаться, если файла нет.
  • notifempty — не ротировать пустой лог.
  • create — создать новый файл после ротации с указанными правами.

Ротация по размеру

Если лог растёт непредсказуемо, удобнее использовать ограничение по размеру:

/var/log/myapp/app.log {
    size 50M
    rotate 10
    compress
}

Здесь лог ротируется, как только его размер превысит 50МБ.

Команды before/after (prerotate и postrotate)

Удобно, если сервису нужно отправить сигнал после ротации логов.

Например, Nginx должен вызвать nginx -s reopen:

/var/log/nginx/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        systemctl reload nginx >/dev/null 2>&1 || true
    endscript
}

Ключевые моменты:

  • sharedscripts — команда выполняется один раз, даже если совпадает несколько файлов.
  • postrotate / endscript — блок команд после ротации.

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

Проверяем конфигурацию:

logrotate -d /etc/logrotate.conf

-d только показывает, что будет сделано.

Запускаем ротацию вручную:

logrotate -f /etc/logrotate.conf

-f — принудительный запуск независимо от условий.

Как работает порядок ротации

Представим лог:

app.log

После ротации:

app.log → app.log.1
app.log.1.gz → app.log.2.gz
…

Logrotate сам «сдвигает» версии в сторону увеличения.

Политика хранения: rotate vs maxage

Два похожих параметра:

rotate N

Хранит N архивов.
Пример:

rotate 7

→ будет app.log.1.gz … app.log.7.gz

maxage N

Удаляет файлы старше N дней.
Пример:

maxage 30

→ удалит всё старше 30 дней, даже если rotate >= 10.

Эти параметры можно комбинировать.

Ротация для приложений с нестандартным логированием

Если приложение открывает файлы каждый раз заново — лог можно просто заменить create.

Но если оно держит файловый дескриптор постоянно (Node.js, Python, Java), используется:

copytruncate

Пример:

/var/log/myapp/app.log {
    daily
    rotate 5
    compress
    copytruncate
}

Как работает copytruncate:

  • создаёт копию старого файла;
  • текущий файл обрезает до нуля.

Это позволяет избежать сигналов reopen и перезапуска приложения.

Минус — возможно потерять часть данных в момент копирования.

Использование systemd-таймера вместо cron

На современных системах логика ротации живёт в systemd:

Проверить:

systemctl status logrotate.timer

Запустить вручную:

systemctl start logrotate.service

Посмотреть расписание:

systemctl list-timers | grep logrotate

Итоги

logrotate — гибкий инструмент для автоматического управления логами в Linux. Он позволяет:

  • ограничивать размер логов;
  • выполнять архивирование;
  • автоматически создавать новые файлы;
  • отправлять сервисам сигналы для корректной работы;
  • удалять устаревшие логи по дате или количеству.

Для админов и разработчиков это базовый инструмент, который должен быть настроен в каждой продакшн-среде.

8 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний