Ротация и сжатие логов с помощью 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:
- daily – ротировать логи ежедневно; также можно указать
weeklyилиmonthly. - missingok – не завершаться с ошибкой, если лог-файл отсутствует.
- rotate 14 – хранить 14 ротированных копий перед удалением.
- compress – сжимать ротированные логи с помощью gzip.
- delaycompress – не сжимать самую свежую ротацию; полезно, если приложение ещё держит файл открытым.
- notifempty – пропускать ротацию, если лог-файл пуст.
- create 0640 www-data adm – создавать новый пустой лог с указанными правами, владельцем и группой. Владелец должен совпадать с пользователем, под которым работает приложение (в системах на базе Debian часто
www-data, в системах на базе RHEL обычноapacheилиnginx). - sharedscripts – выполнять postrotate-скрипт один раз, даже если совпало несколько файлов.
- postrotate – сигнализировать приложению о повторном открытии файловых дескрипторов после ротации.
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
The -d mode outputs diagnostic information but does not modify any files.
4.2 Принудительный реальный запуск
Если пробный запуск выглядит корректно – выполните настоящую ротацию принудительно с помощью флага -f:
sudo logrotate -f /etc/logrotate.d/myapp
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
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