Log Rotation: як влаштовано, стратегії ротації та налаштування для мобільних проєктів

Автор: IT Sectr Опубліковано: 2026-05-28 Час читання: 8 хв

Log Rotation — це механізм автоматичного керування файлами логів, який запобігає переповненню диска за рахунок архівації, стиснення та видалення старих записів. У мобільних застосунках логи накопичуються на пристрої користувача, і без ротації вони можуть зайняти гігабайти пам'яті за кілька тижнів використання. За даними Redis Documentation, коректне налаштування log rotation знижує ризик відмови системи через заповнений диск на 99% порівняно з безконтрольним зростанням логів. Основні стратегії ротації: за розміром файлу, за часом та за кількістю файлів — кожна вибирається залежно від сценарію використання: logrotate у Linux, CocoaLumberjack на iOS і Timber на Android підтримують усі три підходи.

Головне

  • Log Rotation — автоматична зміна активного файлу лога при досягненні заданого порогу з архівацією або видаленням старих файлів
  • Ротація за розміром — створення нового файлу коли поточний досягає ліміту (типово 10–100 МБ), старий стискається в .gz
  • Ротація за часом — зміна файлу кожні N годин або раз на добу незалежно від розміру, зручна для щоденних дампів
  • logrotate — стандартна утиліта Linux для автоматичної ротації системних та прикладних логів
  • Квота диска — обмеження сумарного об'єму всіх логів на пристрої, при перевищенні якого видаляються найстаріші файли

Що таке Log Rotation

Log Rotation — це процес періодичної зміни активного файлу лога на новий з одночасною архівацією, стисненням або видаленням старого. Без ротації один файл лога зростає нескінченно, поки не заповнить весь розділ диска, що призводить до відмови застосунку та втрати даних.

Типовий сценарій: застосунок пише логи у файл app.log. Коли app.log досягає 100 МБ, система перейменовує його в app.log.1, стискає в app.log.1.gz і створює новий порожній app.log. При наступному заповненні app.log.1 стає app.log.2, app.log.1.gz — app.log.2.gz, а старий app.log.2.gz видаляється. Цей механізм називається ротацією з keep count — кількість архівних копій фіксована.

За даними Splunk (2023), неправильна конфігурація ротації — причина 40% інцидентів, пов'язаних із заповненням диска на серверах застосунків. Для мобільних пристроїв ротація ще критичніша, оскільки користувач не може і не повинен керувати логами вручну.

Стратегії ротації логів

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

СтратегіяТригерКоли використовувати
За розміромФайл досяг N байтВисоконавантажені системи з непередбачуваним об'ємом логів
За часомМинуло N годин/днівЩоденні дампи, вимоги відповідності
За кількістю файлівСтворено N файлівМобільні пристрої з обмеженим дисковим простором

Ротація за розміром — найпоширеніша

Ротація за розміром гарантує, що жоден файл лога не перевищує заданий ліміт. Ліміт вибирається виходячи з доступного дискового простору та частоти логування. Для сервера типовий ліміт — 100–500 МБ на файл, для мобільного пристрою — 1–10 МБ. Якщо застосунок логує агресивно, ліміт потрібно знижувати, інакше ротація відбуватиметься кожні кілька хвилин.

Ротація за часом — для відповідності

Ротація за часом незалежна від об'єму логів — файл змінюється строго за розкладом. Зручна для систем, де логи повинні зберігатися фіксовану кількість днів: щоденна ротація з keep count = 30 означає 30 днів зберігання. Недолік — один файл може вирости до гігабайта за день при інтенсивному навантаженні.

logrotate в Linux: конфігурація та приклади

logrotate — стандартна утиліта Linux для автоматичної ротації логів. Вона запускається по cron і обробляє конфігураційні файли з /etc/logrotate.d/. Кожен сервіс (nginx, postgresql, застосунок) створює свій конфіг із зазначенням шляхів до логів, стратегії ротації та дій після ротації.

cpp
# /etc/logrotate.d/myapp — ротація логів застосунку
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data www-data
    postrotate
        kill -HUP $(cat /var/run/myapp.pid)
    endscript
}

Цей конфіг ротує логи щоденно, зберігає 7 архівних копій, стискає старі файли gzip (крім останнього — delaycompress), не видає помилку якщо логів немає (missingok), не ротує порожні файли (notifempty) і перестворює файл з правами 0640. Після ротації надсилає HUP-сигнал процесу застосунку через postrotate-скрипт.

Параметри logrotate

size — ротація при досягненні розміру (size 100M). rotate — кількість архівних копій (rotate 7). compress — стиснення gzip. dateext — додавання дати в ім'я файлу замість порядкового номера. sharedscripts — виконання postrotate один раз для всіх файлів, а не для кожного окремо. maxage — видалення архівів старших N днів.

Log Rotation у мобільних застосунках

На мобільних пристроях Log Rotation критична, тому що користувач не керує файловою системою і не очікує, що застосунок займе гігабайти логами. iOS та Android мають вбудовані механізми: os_log на iOS використовує кільцевий буфер фіксованого розміру (ротація за перезаписом), Android Logcat має обмежений буфер в ядрі.

Для кастомних файлових логів на iOS використовується CocoaLumberjack з класом DDFileLogger, який підтримує ротацію за розміром і за часом. На Android — Logback або самописні реалізації через RollingFileAppender. Обидва інструменти дозволяють задати максимальний розмір файлу та кількість архівів.

swift
// CocoaLumberjack — файлова ротація на iOS
import CocoaLumberjack

let fileLogger = DDFileLogger()
fileLogger.maximumFileSize = 1024 * 1024 // 1 МБ
fileLogger.logFileManager.maximumNumberOfLogFiles = 5
DDLog.add(fileLogger)

iOS: os_log не потребує ротації — повідомлення перезаписуються в кільцевому буфері. Але якщо застосунок пише кастомні файлові логи (наприклад, для налагодження або для відправки на сервер), ротацію потрібно налаштовувати вручну. CocoaLumberjack — стандартний вибір для iOS-команд, він автоматично стискає архіви в .gz і видаляє старі файли при перевищенні ліміту.

Чому ротація важлива на Android

Android не обмежує застосунок у записі логів у власну директорію. Якщо розробник пише debug-логи у файл без ротації, за місяць активного використання вони можуть зайняти 500 МБ — 1 ГБ. Користувач виявить проблему коли система покаже попередження про нестачу місця і видалить застосунок. Logback з RollingFileAppender вирішує цю проблему: ліміт 5 МБ з 3 архівами гарантує, що логи ніколи не займуть більше 20 МБ.

Приклади реалізації ротації на iOS та Android

Нижче наведено приклади налаштування ротації логів на обох платформах. На iOS використовується CocoaLumberjack, на Android — Logback з конфігурацією через XML.

kotlin
// Logback на Android — конфігурація ротації в logback.xml
// Розмір файлу 5МБ, 3 архівні копії
@file:Suppress("unused")

// У logback.xml:
// <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
//   <file>${DATA_DIR}/logs/app.log</file>
//   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
//     <fileNamePattern>app.%i.log.gz</fileNamePattern>
//     <minIndex>1</minIndex>
//     <maxIndex>3</maxIndex>
//   </rollingPolicy>
//   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
//     <maxFileSize>5MB</maxFileSize>
//   </triggeringPolicy>
// </appender>

CocoaLumberjack на iOS підтримує не тільки ротацію за розміром, а й видалення старих логів за датою за допомогою logFileManager.maximumLogFiles. Якщо задати maximumLogFiles = 0, обмеження знімається — логи будуть накопичуватися нескінченно, що небезпечно для production.

swift
// Кастомна ротація з перевіркою загального об'єму
class SizeAwareLogger {
    let maxTotalSize: Int64 = 20 * 1024 * 1024

    func enforceQuota(at logDirectory: URL) {
        let files = (try? FileManager.default
            .contentsOfDirectory(
                at: logDirectory,
                includingPropertiesForKeys: [.fileSize]
            )) ?? []
        let total = files.reduce(0) {
            $0 + (try? $1.resourceValues(forKeys: [.fileSize])
                .fileSize).map(Int64.init) ?? 0
        }
        if total > maxTotalSize {
            // Видаляємо найстаріший файл
            files.sorted { $0.path < $1.path }.first.map {
                try? FileManager.default.removeItem(at: $0)
            }
        }
    }
}

Моніторинг та оповіщення при ротації

Log Rotation — це не тільки автоматична архівація, а й індикатор здоров'я системи. Якщо логи ротуються занадто часто (кожні кілька хвилин), це сигнал про надмірне логування або про помилку в циклічному логуванні помилок (error log loop). Налаштуйте оповіщення на частоту ротації: більше 10 ротацій на годину — привід для перевірки.

Системи моніторингу (Prometheus, Grafana, Datadog) можуть відстежувати метрики ротації через експортери файлової системи. Prometheus node_exporter надає метрики розміру файлів та часу їх модифікації. На мобільних пристроях моніторинг ротації зазвичай вбудований в SDK: CocoaLumberjack логує подію ротації через DDLog, а Logback надсилає статус через appender.

Оповіщення: якщо архівів стало більше очікуваного (rotate count перевищив ліміт) або загальний об'єм логів перевищив квоту — система повинна сповістити адміністратора. Для серверів стандартний поріг — 80% від розміру розділу, для мобільних пристроїв — оповіщення при перевищенні 50 МБ на застосунок.

Часті запитання

Який розмір файлу лога оптимальний для ротації?

Для серверів — 100–500 МБ, для мобільних застосунків — 1–10 МБ. Занадто маленький ліміт (менше 1 МБ) викликає часту ротацію та зайві операції введення-виведення. Занадто великий (більше 500 МБ) збільшує час відкриття та пошуку у файлі.

Скільки архівних копій логів зберігати?

Для продакшену — мінімум 7 днів (щоденна ротація) або 3–5 архівів (ротація за розміром). Для compliance-вимог — 30–90 днів, але тоді використовуйте окреме сховище зі стисненням і retention policy, а не ротацію на тому ж розділі.

Як logrotate працює на мобільних пристроях?

logrotate — Linux-утиліта, на iOS та Android вона недоступна. На мобільних пристроях ротацію реалізують бібліотеки: CocoaLumberjack для iOS та Logback для Android. Вони не потребують root-доступу і працюють у sandbox-середовищі застосунку.

Що робити, якщо логи ротуються щохвилини?

Перевірте, чи немає циклічного логування — коли обробка помилки сама генерує нову помилку. Додайте захист: лічильник повторних логувань одного типу з порогом (не більше 100 однакових повідомлень на хвилину) та тимчасовим блокуванням після перевищення.

Чи обов'язково стискати архіви логів?

Не обов'язково, але рекомендується. gzip стискає текстові логи в 10–20 разів без втрати даних. На мобільних пристроях стиснення знижує займане місце з 50 МБ до 3–5 МБ. Єдиний мінус — архів не можна прочитати без розпакування, але для аналізу зазвичай потрібен тільки поточний файл.

Підсумки

  • Log Rotation — автоматичне керування файлами логів зі створенням нових файлів при досягненні ліміту та архівацією старих для запобігання переповненню диска
  • Три стратегії — за розміром файлу (найпоширеніша), за часом (для дампів) та за кількістю файлів (для мобільних пристроїв з обмеженим простором)
  • logrotate — стандартна утиліта Linux для серверної ротації з гнучкими параметрами: daily, size, compress, rotate, postrotate-скрипти
  • Мобільні бібліотеки — CocoaLumberjack на iOS та Logback на Android підтримують ротацію за розміром зі стисненням та обмеженням кількості архівів
  • Квота диска — сумарний ліміт на всі логи: 20 МБ для мобільних застосунків і 80% від розділу для серверів з оповіщенням при перевищенні
  • Моніторинг — занадто часта ротація (більше 10 разів на годину) сигналізує про циклічне логування помилок або надмірний об'єм логів
  • Стиснення gzip — зменшує об'єм архівів у 10–20 разів, рекомендується для всіх платформ, delaycompress залишає останній архів нестисненим для швидкого читання

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також