Ротація та стиснення логів за допомогою logrotate | INTROSERV
EUR
european

EUR

usa

USD

Ukraine Ua
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-based системах часто www-data, у RHEL-based – зазвичай 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