Linux

Настройка logrotate в Linux: полное руководство по ротации логов

Это руководство помогает системным администраторам и разработчикам настроить logrotate — стандартный инструмент Linux для управления логами. Вы научитесь создавать конфигурации, тестировать их и решать типичные проблемы, чтобы предотвратить переполнение диска логами.

Обновлено 8 апреля 2026 г.
15-20 мин
Низкая
FixPedia Team
Применимо к:Ubuntu 20.04/22.04Debian 11/12CentOS 7/8RHEL 7/8Linux ядро 4.x+

Введение / Зачем это нужно

Logrotate — это стандартный утилита в Linux для автоматической ротации, сжатия и удаления старых лог-файлов. Без настройки логи могут бесконечно расти, заполняя весь диск и вызывая сбои в работе системы. Настроив logrotate, вы:

  • Автоматически управляете размером логов.
  • Сохраняете историю за заданный период (например, 7 дней).
  • Сжимаете архивы, экономя место.
  • Обеспечивайте бесперебойную работу сервисов, которые пишут логи.

Этот гайд подойдет для администраторов Linux и разработчиков, которые работают с серверами (веб-серверы, базы данных, кастомные приложения).

Требования / Подготовка

Перед началом убедитесь, что:

  1. У вас есть root-доступ или права sudo для редактирования файлов в /etc/.
  2. Logrotate установлен (обычно есть по умолчанию в большинстве дистрибутивов). Проверьте командой:
    which logrotate
    
    Если нет, установите:
    • Ubuntu/Debian: sudo apt update && sudo apt install logrotate
    • CentOS/RHEL: sudo yum install logrotate
  3. Логи пишутся в файлы, а не только в stdout/stderr. Если приложение пишет в stdout (например, Docker без драйвера json-file), настройте перенаправление в файл или используйте systemd-journald.

Шаг 1: Создание конфигурационного файла

Logrotate читает конфигурации из двух мест:

  • Основной файл: /etc/logrotate.conf
  • Дополнительные файлы в /etc/logrotate.d/ (рекомендуется для каждого сервиса отдельно).

Создайте конфиг для вашего приложения. Например, для веб-сервера Nginx:

sudo nano /etc/logrotate.d/nginx

Добавьте базовый шаблон:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 644 www-data www-data
    sharedscripts
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

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

  • /var/log/nginx/*.log — путь к логам (поддерживаются wildcards).
  • daily — ротация каждый день.
  • missingok — игнорировать, если файл лога отсутствует.
  • rotate 14 — хранить 14 архивов.
  • compress — сжимать ротированные логи gzip (файлы .gz).
  • delaycompress — сжимать не сразу, а на следующий день (чтобы можно было читать свежий лог).
  • notifempty — не ротировать пустые файлы.
  • create 644 www-data www-data — создавать новый пустой лог-файл с указанными правами и владельцем после ротации.
  • sharedscripts — выполнять скрипты (postrotate) один раз для всех файлов в блоке.
  • postrotate — после ротации отправить сигнал Nginx, чтобы он переоткрыл файлы логов.

Для других приложений укажите свои пути и команды переоткрытия логов (например, для Apache: invoke-rc.d apache2 reload).

Шаг 2: Настройка параметров ротации

Вы можете настроить частоту и другие опции под свои нужды:

  • Частота: daily (ежедневно), weekly (еженедельно), monthly (ежемесячно). Можно также использовать hourly (ежечасно), если logrotate запускается из cron hourly (обычно нет).
  • Количество архивов: rotate N — сколько последних архивов хранить. Например, rotate 30 — хранить 30 дней.
  • Удаление по возрасту: maxage N — удалять архивы старше N дней (даже если rotate не достигнуто).
  • Размер вместо времени: size 100M — ротировать, когда лог достигает 100 МБ (можно комбинировать с частотой: daily и size работают вместе).
  • Сжатие: compress (gzip) или nocompress. Для более быстрого сжатия можно использовать delaycompress.
  • Права на новые файлы: create mode owner group (как в примере выше).

Пример для логов приложения, которое пишет в /opt/myapp/logs/app.log и требует перезапуска службы:

/opt/myapp/logs/app.log {
    weekly
    rotate 8
    compress
    delaycompress
    missingok
    notifempty
    create 640 myuser mygroup
    sharedscripts
    postrotate
        systemctl restart myapp.service > /dev/null 2>&1 || true
    endscript
}

Шаг 3: Тестирование конфигурации

После создания конфига обязательно протестируйте его:

  1. Сухой прогон (dry-run):
    sudo logrotate -d /etc/logrotate.conf
    

    Флаг -d показывает, какие действия будут выполнены, но не применяет их. Ищите в выводе ошибки (например, "error: bad option" или "cannot open").
  2. Принудительный запуск:
    sudo logrotate -f /etc/logrotate.conf
    

    Флаг -f (force) запускает ротацию независимо от времени. После этого проверьте, что:
    • Старые логи переименованы (например, access.log.1, access.log.2.gz).
    • Создан новый пустой лог-файл (если указан create).
    • Сжатые файлы имеют расширение .gz.
  3. Проверка логов самого logrotate: Обычно logrotate пишет свои ошибки в syslog. Проверьте:
    grep logrotate /var/log/syslog
    # или для RHEL/CentOS:
    grep logrotate /var/log/messages
    

Шаг 4: Автоматизация через cron

Logrotate по умолчанию запускается из cron ежедневно. Проверьте наличие скрипта:

ls -l /etc/cron.daily/logrotate

Обычно это символическая ссылка на /usr/sbin/logrotate. Если нужно изменить расписание (например, на еженедельное), отредактируйте crontab root:

sudo crontab -e

И замените строку (если есть) на:

0 3 * * 0 /usr/sbin/logrotate /etc/logrotate.conf

Это запустит logrotate в 3:00 утра каждое воскресенье.

Важно: Не запускайте logrotate слишком часто (например, каждые 5 минут) для больших логов — это может нагрузить систему.

Проверка результата

После принудительного запуска (или по истечении периода) убедитесь, что:

  1. Ротированные файлы появились в папке с логами:
    ls -lh /var/log/nginx/
    

    Вы должны увидеть access.log.1 (прошлый день) и, возможно, access.log.2.gz (архив).
  2. Новый лог-файл создан и имеет правильные права (если использовали create).
  3. Приложение продолжает писать логи в новый файл. Проверьте, что в access.log (новом) появляются записи.
  4. Размер диска не растет бесконтрольно:
    sudo du -sh /var/log/nginx/
    
  5. Количество архивов не превышает rotate. Если хранится больше, возможно, maxage конфликтует или старые файлы не удаляются из-за прав.

Возможные проблемы

1. Ошибка "Permission denied" при ротации или создании файлов

Причина: Пользователь, от которого запущен logrotate (обычно root), не имеет прав на запись в директорию с логами или на создание файлов с указанными владельцем/группой. Решение:

  • Убедитесь, что директория с логами доступна для записи root (или укажите правильного владельца в create).
  • Если логи пишет непривилегированный пользователь (например, www-data), используйте su www-data в блоке конфига (если logrotate поддерживает) или настройте права так, чтобы root мог менять файлы.

2. Logrotate не ротирует логи, хотя прошло время

Причина:

  • Неправильная настройка частоты (например, daily, но вы тестируете в тот же день).
  • Файл лога не изменился с последней ротации (если есть notifempty и файл пустой).
  • Logrotate не запускается из cron (проверьте /etc/cron.daily/).

Решение:

  • Используйте logrotate -f для принудительной ротации.
  • Уберите notifempty, если хотите ротировать пустые файлы.
  • Проверьте, что cron работает: systemctl status cron (Debian/Ubuntu) или crond (RHEL/CentOS).

3. Приложение перестает писать логи после ротации

Причина: Приложение не переоткрывает файл лога после его переименования. Обычно это решается сигналом в postrotate (например, kill -USR1 для Nginx) или перезапуском службы. Решение:

  • Убедитесь, что команда в postrotate корректна и не вызывает ошибок. Протестируйте ее вручную.
  • Для systemd-сервисов можно использовать systemctl reload <service>.
  • Если приложение пишет в файл напрямую без буферизации, оно может продолжить писать в старый файл (который переименован). В этом случае перезапуск службы необходим.

4. Сжатие занимает много времени или ресурсов

Причина: Большие логи сжимаются в момент пиковой нагрузки. Решение:

  • Используйте delaycompress — сжатие откладывается до следующего запуска logrotate.
  • Настройте ротацию по размеру (size 500M) в менее загруженное время.
  • Рассмотрите использование compresscmd с более быстрым алгоритмом (например, pigz для параллельного сжатия), если установлен.

5. Ротируются не те файлы (например, ротируются архивы .gz)

Причина: Шаблон пути слишком общий (например, /var/log/app/* захватывает и .gz файлы). Решение: Уточните шаблон: /var/log/app/*.log вместо /var/log/app/*. Или добавьте prerotate/postrotate для исключения, но лучше уточнить шаблон.

Часто задаваемые вопросы

Как проверить, что logrotate работает корректно?
Какой интервал ротации выбрать: daily, weekly или monthly?
Logrotate не удаляет старые логи, хотя указано rotate 7. Почему?
Можно ли настроить logrotate для конкретного приложения, например, Docker?

Полезное

Создание конфигурационного файла
Настройка параметров ротации
Тестирование конфигурации
Добавление в cron

Эта статья помогла вам решить проблему?