EUR
european

EUR

usa

USD

Russian Ru
Ex. VAT Ex. VAT 0%

Ротация и сжатие логов с помощью logrotate

  • Уровень: Средний (Intermediate)
  • Примерное время: ~20 минут
  • Цель: Настроить logrotate для автоматического сжатия и ротации лог-файлов приложения, чтобы предотвратить переполнение диска.

Введение

Логи – являются критической частью управления любым production-приложением: без них надёжно понять, что пошло не так и что с этим делать, было бы очень сложно. Нагруженное приложение может генерировать тысячи записей в минуту, и все они обычно хранятся в файлах. Нам нужно своевременно сжимать и удалять старые логи, чтобы не исчерпать место на диске. В этом туториале мы настроим logrotate на Linux-сервере.

Что такое logrotate?

logrotate – это Linux-утилита, созданная для упрощения администрирования систем, генерирующих большое количество лог-файлов. Она позволяет автоматически сжимать, ротировать и удалять логи. Обычно запускается ежедневно, еженедельно или ежемесячно через cron или systemd timer.

Предварительные требования

Перед началом убедитесь, что выполнены следующие условия:

  • Операционная система: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12 или CentOS/RHEL 7+
  • logrotate: версия 3.x (проверка – в шаге 1)
  • Доступ: sudo или root-доступ к серверу
  • Необходимые знания: уверенное использование командной строки Linux и базовое редактирование файлов

Шаг 1: Проверка установки logrotate

Чтобы проверить установку, просто выполните:

logrotate --version

Ожидаемый результат:

logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status

Если команда не найдена – logrotate не установлен. Установите его:

Debian/Ubuntu:

sudo apt install logrotate

CentOS/RHEL:

sudo yum install logrotate

Шаг 2: Понимание структуры конфигурации

Главный конфиг находится в /etc/logrotate.conf – пока что оставим его без изменений. Наши правила для конкретных сервисов пойдут в /etc/logrotate.d/ – туда нужно положить отдельный файл для каждого сервиса.

Прежде чем что-то добавлять, проверьте, нет ли уже готового конфига для вашего сервиса:

ls /etc/logrotate.d/

Для популярных сервисов вроде nginx или Apache конфиги обычно уже присутствуют. Если nginx или apache2 там уже есть – откройте этот файл и подстройте количество ротаций и настройки сжатия под себя, вместо того чтобы создавать дубликат.

Шаг 3: Добавление конфигурации для сервиса

Предположим, есть кастомное приложение, и его логи находятся в /opt/myapp/*.log.

Создаём и открываем файл:

sudo nano /etc/logrotate.d/myapp

Вставляем внутрь:

/opt/myapp/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload myapp > /dev/null 2>&1 || true endscript }

Этим конфигом мы заставляем logrotate:

  1. daily – ротировать логи ежедневно; также можно указать weekly или monthly.
  2. missingok – не завершаться с ошибкой, если лог-файл отсутствует.
  3. rotate 14 – хранить 14 ротированных копий перед удалением.
  4. compress – сжимать ротированные логи с помощью gzip.
  5. delaycompress – не сжимать самую свежую ротацию; полезно, если приложение ещё держит файл открытым.
  6. notifempty – пропускать ротацию, если лог-файл пуст.
  7. create 0640 www-data adm – создавать новый пустой лог с указанными правами, владельцем и группой. Владелец должен совпадать с пользователем, под которым работает приложение (в системах на базе Debian часто www-data, в системах на базе RHEL обычно apache или nginx).
  8. sharedscripts – выполнять postrotate-скрипт один раз, даже если совпало несколько файлов.
  9. postrotate – сигнализировать приложению о повторном открытии файловых дескрипторов после ротации.

Info

If the directory /opt/myapp/ or the log files do not yet exist at the time of the first run, that's not a problem. The missingok directive will cause logrotate to silently skip the file without throwing an error. Log rotation will start automatically as soon as the application creates the logs.

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

4.1 Пробный запуск

После написания конфигурации нужно её проверить. Флаг -d запускает logrotate в режиме отладки – ничего реально не изменяется:

sudo logrotate -d /etc/logrotate.d/myapp

Info

The -d mode outputs diagnostic information but does not modify any files.

4.2 Принудительный реальный запуск

Если пробный запуск выглядит корректно – выполните настоящую ротацию принудительно с помощью флага -f:

sudo logrotate -f /etc/logrotate.d/myapp

Info

Important: The -f flag triggers an actual rotation. Run it only after the test run looks correct.

Шаг 5: Проверка результата

После первых нескольких ротаций проверьте директорию с логами:

ls -lh /opt/myapp/

Ожидаемый результат:

total 28K -rw-r----- 1 www-data adm 0 Jan 17 12:00 app.log -rw-r----- 1 www-data adm 12K Jan 17 11:59 app.log.1 -rw-r----- 1 www-data adm 11K Jan 16 12:00 app.log.2.gz -rw-r----- 1 www-data adm 9K Jan 15 12:00 app.log.3.gz

Самая свежая ротация (app.log.1) остаётся несжатой из-за delaycompress. Всё более старое – сжато gzip. Именно этого мы и хотели.

Шаг 6: Проверка автоматического расписания

logrotate запускается автоматически – через cron или systemd timer, в зависимости от дистрибутива.

Cron-based системы

cat /etc/cron.daily/logrotate

Если файл существует – хорошо, именно он запускает logrotate ежедневно.

Systemd-based системы

На новых системах logrotate может запускаться через systemd timer вместо cron.

Проверьте:

systemctl list-timers | grep logrotate

Вы должны увидеть таймер с временем последнего и следующего запуска, примерно так:

Thu 2026-01-18 00:00:00 UTC 23h left Wed 2026-01-17 00:00:11 UTC 47 min ago logrotate.timer

Если строка logrotate.timer в выводе отсутствует – таймер отключён. Включите его:

sudo systemctl enable logrotate.timer

sudo systemctl start logrotate.timer

Файл состояния

Проверить, когда logrotate последний раз срабатывал, можно через его собственный файл состояния:

cat /var/lib/logrotate/status

Это собственная история ротаций logrotate. После первого реального запуска вы увидите каждый лог-файл с датой последней ротации:

"/opt/myapp/app.log" 2026-1-17 "/var/log/nginx/access.log" 2026-1-17

Если какой-то лог не ротируется когда ожидается – это первое место, где стоит искать.

Откат изменений

Если нужно отменить всё сделанное, просто удалите конфиг-файл из /etc/logrotate.d/:

sudo rm /etc/logrotate.d/myapp

Это остановит обработку логов вашего приложения. Уже ротированные файлы при этом не удаляются.

Если нужно удалить logrotate полностью:

Debian/Ubuntu:

sudo apt remove logrotate

CentOS/RHEL:

sudo yum remove logrotate

Info

Important: Removing logrotate will disable log rotation for the entire system, including nginx, rsyslog, and other services that rely on it.

Заключение

Вот и всё. Один хорошо написанный файл в /etc/logrotate.d/, проверенный через -d, – и готово. Логи остаются аккуратными, диск здоровым, и об этом больше не нужно думать.

Document Version: 1.2
Last Updated: March 2026
Owner: Technical Documentation Team

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA