Ротація та стиснення логів за допомогою 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-based системах часто
www-data, у RHEL-based – зазвичай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