Налаштування Log Rotation (logrotate) для керування розміром логів

Логи накопичуються і непомітно заповнюють диск, поки сервіс не падає з помилкою «No space left on device». Ми налаштовуємо logrotate — автоматичну ротацію, стиснення та видалення старих файлів, щоб логи завжди були під контролем. Наша команда реалізує проєкт під ключ — від аналізу поточної ситуації до впровадження та подальшої підтримки.
Часті запитання

Ми не раз бачили /var/log/nginx/access.log на 47 гігабайт на Linux-сервері з 50 GB диском — класика. Наші інженери мають 5+ років досвіду в налаштуванні logrotate та виконали понад 200 успішних проектів. Знаємо: логи пишуться місяцями без ротації, поки диск не заповнюється, і сервіс падає з No space left on device. Або гірше — застосунок продовжує працювати, але мовчки перестає писати логи, і ніхто цього не помічає до інциденту. Ручне чищення логів через rm — тимчасове рішення, яке неминуче повертає проблему. На кожному сервері ми звільняємо до 30 ГБ дискового простору (економія до 70%), запобігаючи простоям вартістю в тисячі доларів на годину. За 5 років роботи ми налаштували ротацію більш ніж на 200 серверах — автоматична ротація з logrotate єдиний надійний спосіб тримати логи під контролем. Гарантуємо коректну роботу logrotate після налаштування.

Як працює logrotate

Згідно з man-сторінкою logrotate, утиліта призначена для спрощення адміністрування систем, що генерують велику кількість лог-файлів. logrotate запускається через cron або systemd timer (/etc/cron.daily/logrotate). Читає конфіги з /etc/logrotate.conf та /etc/logrotate.d/. Для кожного лог-файлу перевіряє умови ротації та виконує дію: перейменовує, стискає, надсилає сигнал процесу.

Приклад logrotate конфіг для Nginx:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

delaycompress — стискає не щойно ротований файл, а попередній. Потрібно, якщо процес тримає файловий дескриптор відкритим після ротації та дописує в нього ще якийсь час. sharedscripts — postrotate виконується один раз для всіх файлів маски, не для кожного.

Сигнал USR1 змушує Nginx перевідкрити файли логів. Без цього Nginx продовжить писати в перейменований файл через старий дескриптор, а новий access.log залишиться порожнім.

Що входить у налаштування logrotate

При замовленні послуги ми:

  • Аналізуємо поточну конфігурацію логування (куди пишуть застосунки, які файли, права доступу).
  • Проектуємо політику ротації: частота, кількість архівів, стиснення, обробка postrotate.
  • Створюємо окремі конфігураційні файли для кожного сервісу (Nginx, PostgreSQL, custom-застосунки).
  • Налаштовуємо автоматичний запуск (cron/systemd timer) та перевіряємо коректність через logrotate -d.
  • Тестуємо ротацію в тестовому середовищі, а потім застосовуємо на продакшені.
  • Передаємо документацію зі створених конфігів та інструкцію з моніторингу логів.

Як налаштувати logrotate для кількох застосунків?

Для кожного застосунку — окремий файл у /etc/logrotate.d/. Загальні параметри виносяться в /etc/logrotate.conf. Ми рекомендуємо групувати логи за типом: для веб-серверів (Nginx, Apache) — daily з rotate 14, для більш рідкісних логів — weekly з rotate 8. Обов'язково додавайте compress — стиснення логів зменшує об'єм у 4-6 разів у порівнянні з нестисненими логами.

Порівняння методів ротації copytruncate postrotate + kill journald Docker log-opt
Підходить для Застосунків без сигналу Сервіси, що підтримують USR1 systemd логи Контейнерні логи
Втрата даних Можлива (кілька рядків) Ні Ні Ні
Стиснення Підтримується Підтримується Вбудовано Залежить від драйвера
Ручне налаштування logrotate logrotate journalctl Docker CLI
Частота ротації Коли використовувати Приклад rotate
Daily Високе навантаження, багато запитів (Nginx, API) 14 (2 тижні)
Weekly Середнє навантаження, логи застосунків 8 (2 місяці)
Monthly Низьке навантаження, архівні дані 12 (рік)

Економія на дисковому просторі сягає 70%, що при вартості зберігання 10 000 грн за ТБ на місяць дає суттєву економію. Вартість налаштування logrotate стартує від 500 грн за сервер — це в 10 разів дешевше, ніж наслідки простою.

Особливості для різних застосунків

Journald — окрема історія: journalctl --vacuum-size=2G або параметри в /etc/systemd/journald.conf (SystemMaxUse=2G, MaxRetentionSec=1month). logrotate до бінарного журналу не застосовується.

logrotate postgresql — PostgreSQL пише логи через власний механізм (log_rotation_age, log_rotation_size в postgresql.conf). logrotate потрібен тільки якщо включено logging_collector = on із записом у файли.

Docker — у контейнерів власна політика логування (--log-opt max-size=100m --log-opt max-file=5 або в daemon.json). logrotate контейнерні логи не чіпає.

Для custom-застосунків, які пишуть у /var/log/app/:

/var/log/app/*.log { weekly rotate 8 compress delaycompress missingok notifempty copytruncate } 

copytruncate — копіює файл, потім обрізає оригінал до нуля. Використовується, якщо застосунок не вміє перевідкривати файл за сигналом. Мінус: між копією та очищенням кілька рядків можуть загубитися.

Типові проблеми logrotate

Конфіг написаний, але logrotate -d показує error: skipping "/var/log/app" -- parent directory has insecure permissions. logrotate за замовчуванням відмовляється працювати з директоріями, на які в інших користувачів є write. Фіксується через su app app у конфізі ротації. Ще одна причина — файл логу не створюється (опція missingok це передбачає) або не виконується cron. Регулярно перевіряйте статус: cat /var/lib/logrotate/status.

Як тестувати конфігурацію logrotate?

# Перевірити синтаксис та показати що буде робити — без виконання
logrotate -d /etc/logrotate.d/nginx

# Примусова ротація (ігнорує розклад)
logrotate -f /etc/logrotate.d/nginx

# Подивитися статус останніх ротацій
cat /var/lib/logrotate/status
Часті помилки та їх вирішення
  • Logrotate не запускається — перевірте systemd timer: systemctl status logrotate.timer. Якщо неактивний, увімкніть: systemctl enable --now logrotate.timer.
  • Помилка insecure permissions — додайте директиву su user group у конфіг. Наприклад, su www-data adm.
  • Логи не стискаються — переконайтеся, що compress вказаний без опції nocompress. Також перевірте вільне місце для тимчасових файлів.
  • Застосунок пише у старий файл — використовуйте copytruncate або налаштуйте postrotate з правильним сигналом.

Процес роботи

  1. Аналітика: збір поточних конфігурацій, оцінка обсягів логів, виявлення проблемних місць.
  2. Проектування: вибір політики rotation, розміру архівів, стиснення, розкладу.
  3. Реалізація: написання конфігів для logrotate, налаштування postrotate/copytruncate.
  4. Тестування: запуск у dry-run режимі, перевірка на staging-середовищі.
  5. Деплой: застосування на продакшені, моніторинг протягом тижня, коригування при необхідності.

Строки орієнтовно

Строки налаштування: від 2 до 4 годин для одного сервера. Для кількох серверів або складних конфігурацій (наприклад, з кастомними застосунками) — від 4 до 8 годин. Вартість розраховується індивідуально після оцінки конфігурації.

Якщо ви зіткнулися з переповненням диска або просто хочете автоматизувати ротацію — зв'яжіться з нами для оцінки конфігурації. Отримайте консультацію з ротації логів linux вже сьогодні.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139