Ми не раз бачили /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з правильним сигналом.
Процес роботи
- Аналітика: збір поточних конфігурацій, оцінка обсягів логів, виявлення проблемних місць.
- Проектування: вибір політики rotation, розміру архівів, стиснення, розкладу.
- Реалізація: написання конфігів для logrotate, налаштування postrotate/copytruncate.
- Тестування: запуск у dry-run режимі, перевірка на staging-середовищі.
- Деплой: застосування на продакшені, моніторинг протягом тижня, коригування при необхідності.
Строки орієнтовно
Строки налаштування: від 2 до 4 годин для одного сервера. Для кількох серверів або складних конфігурацій (наприклад, з кастомними застосунками) — від 4 до 8 годин. Вартість розраховується індивідуально після оцінки конфігурації.
Якщо ви зіткнулися з переповненням диска або просто хочете автоматизувати ротацію — зв'яжіться з нами для оцінки конфігурації. Отримайте консультацію з ротації логів linux вже сьогодні.







