Linux

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

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

Обновлено 16 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 22.04+Debian 11+CentOS 8+/RHEL 8+logrotate 3.11+

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

Лог-файлы (/var/log/) — это ключевой источник информации для диагностики проблем в Linux-системе. Со временем они могут занимать гигабайты дискового пространства, замедлять работу приложений и затруднять поиск нужных записей. Logrotate — это стандартная утилита, которая автоматически управляет логами: ротирует (переименовывает старые, создаёт новые), сжимает архивы и удаляет устаревшие файлы. В этом гайде вы настроите logrotate под свои задачи, чтобы:

  • Освободить место на диске, автоматически удаляя старые логи.
  • Упростить анализ, разбивая большие файлы на управляемые части (ежедневные, еженедельные).
  • Сохранить важные данные в сжатом виде (*.gz).
  • Настроить политику хранения для каждого приложения отдельно.

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

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

  1. У вас есть права sudo или доступ к root-пользователю. Настройка системных логов требует повышенных привилегий.
  2. Установлена утилита logrotate. Она входит в базовую поставку几乎所有 дистрибутивов (Ubuntu/Debian, CentOS/RHEL, Fedora). Проверьте: logrotate --version.
  3. Вы понимаете структуру логов вашего приложения: где они находятся (/var/log/...), как называются (app.log, error.log).
  4. Вы знаете политику ротации: как часто вы хотите ротировать (ежедневно, еженедельно), сколько архивов хранить, нужно ли сжатие.

Пошаговая инструкция

Шаг 1: Изучите структуру конфигурации logrotate

Основной конфиг — /etc/logrotate.conf. Он выглядит примерно так:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
#dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

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

  • Директивы вверху (weekly, rotate 4) — это глобальные настройки по умолчанию.
  • Строка include /etc/logrotate.d подключает конфигурации для отдельных приложений из этой директории. Именно туда мы будем добавлять свои правила.
  • Закомментированные параметры (#dateext, #compress) можно раскомментировать, чтобы включить.

Шаг 2: Создайте конфигурацию для вашего приложения

Предположим, у вас есть приложение, пишущее логи в /var/log/myapp/access.log и /var/log/myapp/error.log.

  1. Создайте файл конфигурации:
    sudo nano /etc/logrotate.d/myapp
    
  2. Добавьте следующее содержимое (подробное объяснение ниже):
    /var/log/myapp/*.log {
        daily
        rotate 14
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
        sharedscripts
        postrotate
            systemctl reload myapp.service > /dev/null 2>&1 || true
        endscript
    }
    

    Разбор блока:
    • /var/log/myapp/*.log — путь к лог-файлам (поддерживаются wildcards).
    • daily — ротировать каждый день. Альтернативы: daily, weekly, monthly, yearly.
    • rotate 14 — хранить 14 последних архивов. Старые будут удалены.
    • compress — сжимать ротированные логи с помощью gzip (файлы станут *.log.1.gz).
    • delaycompress — сжимать не самый последний архив (*.log.1), а начиная со второго (*.log.2.gz). Это нужно, чтобы процесс, пишущий в *.log.1, мог продолжать работать.
    • missingok — не выдавать ошибку, если лог-файл отсутствует.
    • notifempty — не ротировать пустой файл.
    • create 644 root root — после ротации создать новый пустой лог-файл с указанными правами и владельцем.
    • sharedscripts — выполнять скрипты postrotate/prerotate один раз для всего блока, а не для каждого файла.
    • postrotate ... endscript — команда, выполняемая после ротации. Здесь мы перезагружаем службу приложения (systemctl reload), чтобы он начал писать в новый файл. Это критично для многих демонов! Для простых файлов, которые пишутся через >> (добавление), можно не использовать postrotate. Фраза || true подавляет ошибку, если служба не запущена.

Шаг 3: Настройте параметры для системных логов (опционально)

Для стандартных системных логов (например, syslog, auth.log) уже есть конфиги в /etc/logrotate.d/. Их можно изменить. Например, в /etc/logrotate.d/syslog:

/var/log/syslog
/var/log/auth.log
/var/log/kern.log
/var/log/dmesg {
    rotate 7
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
    sharedscripts
    create 640 root adm
    mode 640
    owner root
    group adm
}

Обратите внимание: У syslog часто есть postrotate для перезапуска rsyslog.

Шаг 4: Протестируйте конфигурацию

НИКОГДА не тестируйте на "живых" важных логах без бэкапа!

  1. Сухое тестирование (Dry Run):
    sudo logrotate -d /etc/logrotate.conf
    

    Флаг -d включает режим отладки. Вы увидите, какие файлы будут ротированы, какие команды выполнены, но никакие изменения не применятся. Ищите в выводе ошибки (error:).
  2. Принудительная ротация для тестового файла: Создайте тестовый лог:
    echo "Test log entry $(date)" | sudo tee /var/log/myapp/test.log
    

    Принудительно запустите ротацию для конкретного конфига:
    sudo logrotate -f /etc/logrotate.d/myapp
    

    Флаг -f (force) заставляет ротировать файл, даже если по времени/размеру это не требуется. Проверьте результат:
    ls -lh /var/log/myapp/
    

    Вы должны увидеть test.log (новый пустой) и test.log.1 (старый, возможно сжатый).
  3. Проверка статуса: Logrotate хранит информацию о последнем запуске в /var/lib/logrotate/status. Убедитесь, что дата обновилась:
    cat /var/lib/logrotate/status
    

Шаг 5: Убедитесь в автоматической работе по расписанию

Logrotate обычно запускается из cron раз в день. Проверьте:

cat /etc/crontab | grep logrotate

Типичная строка:

17 5 * * * root test -x /usr/sbin/logrotate && /usr/sbin/logrotate /etc/logrotate.conf

Это значит, что утилита запускается каждый день в 5:17. Вы можете изменить расписание, отредактировав этот файл или добавив задание в /etc/cron.daily/logrotate (если ваш дистрибутив использует аналог).

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

  1. Подождите сутки или запустите cron вручную: sudo run-parts /etc/cron.daily.
  2. Проверьте, что старые логи были переименованы и сжаты:
    sudo find /var/log/myapp -type f -name "*.log*" -exec ls -lh {} \;
    
  3. Убедитесь, что новое логирование продолжается в свежий файл access.log (добавьте тестовую запись в приложение и проверьте).
  4. Проверьте, что старые архивы удаляются после превышения лимита rotate.

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

⚠️ Ошибка: "error: error opening /var/log/...: Permission denied"Причина: У пользователя, от которого работает logrotate (обычно root), нет прав на чтение/запись в лог-файлы или директорию. Решение: Убедитесь, что права на лог-файлы и их директорию позволяют чтение/запись root. Например: sudo chown root:root /var/log/myapp && sudo chmod 755 /var/log/myapp.

⚠️ Логи не ротируются, хотя прошло времяПричина 1: Не достигнут размер (если используется size), или не наступил период (daily/weekly). Решение 1: Используйте logrotate -f для принудительной ротации или дождитесь срока. Для теста можно временно добавить size 1k. Причина 2: В конфиге есть notifempty, а лог-файл пустой. Решение 2: Удалите notifempty или убедитесь, что в лог пишется.

⚠️ Приложение продолжает писать в старый (ротированный) файлПричина: Не выполнился postrotate скрипт для перезагрузки/сигнала приложению. Решение: Проверьте команду в postrotate вручную. Убедитесь, что имя службы (systemctl reload myapp) верное и служба существует. Для приложений, которые не реагируют на SIGHUP, может потребоваться restart или полная остановка/запуск.

💡 Совет: Ротация логов, которые пишутся через copytruncate Если приложение нельзя перезагрузить (не поддерживает SIGHUP), используйте опцию copytruncate:

/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    copytruncate
    missingok
    notifempty
}

Как это работает: logrotate делает копию лог-файла, а затем усекает (truncate) исходный файл до нулевого размера. Это безопасно, но есть риск потерять записи, которые были сделаны в момент копирования. Используйте только если нет альтернативы.

💡 Совет: Ротация по размеру Чтобы ротировать лог при достижении определённого размера (например, 100 МБ), добавьте size 100M:

/var/log/myapp/*.log {
    size 100M
    rotate 5
    compress
    delaycompress
    missingok
    notifempty
}

Теперь ротация произойдёт, как только файл превысит 100 МБ, даже если с последней ротации прошло меньше дня.

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

Как проверить, что logrotate работает?
Почему мои логи не ротируются?
Можно ли ротировать логи в реальном времени?
Как ротировать логи Nginx или Apache?

Полезное

Проверьте наличие и версию logrotate
Изучите основной конфигурационный файл
Настройте глобальные параметры (опционально)
Создайте конфигурацию для своего приложения
Протестируйте конфигурацию
Убедитесь в автоматической работе

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