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 MB), стара се компримује у .gz
  • Ротација по времену — промена датотеке сваких N сати или једном дневно независно од величине, погодна за дневне дампове
  • logrotate — стандардни Linux алат за аутоматску ротацију системских и апликативних логова
  • Диск квота — ограничење укупног обима свих логова на уређају, при прекорачењу којег се бришу најстарије датотеке

Шта је Log Rotation

Log Rotation је процес периодичне промене активне датотеке лога на нову уз истовремено архивирање, компресију или брисање старе. Без ротације, једна датотека лога расте бесконачно док не попуни целу партицију диска, што доводи до отказивања апликације и губитка података.

Типичан сценарио: апликација пише логове у датотеку app.log. Када app.log достигне 100 MB, систем је преименује у 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 MB по датотеци, за мобилни уређај — 1–10 MB. Ако апликација агресивно логује, лимит треба смањити, иначе ће се ротација дешавати сваких неколико минута.

Ротација по времену — за усаглашеност

Ротација по времену је независна од обима логова — датотека се мења строго по распореду. Погодна за системе где логови морају да се чувају фиксан број дана: дневна ротација са 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 MB
fileLogger.logFileManager.maximumNumberOfLogFiles = 5
DDLog.add(fileLogger)

iOS: os_log не захтева ротацију — поруке се преписују у кружном баферу. Али ако апликација пише прилагођене логове датотека (нпр. за отклањање грешака или слање на сервер), ротацију треба подесити ручно. CocoaLumberjack је стандардни избор за iOS тимове, аутоматски компримује архиве у .gz и брише старе датотеке при прекорачењу лимита.

Зашто је ротација важна на Android-у

Android не ограничава апликацију у упису логова у сопствени директоријум. Ако програмер пише debug логове у датотеку без ротације, за месец дана активног коришћења могу заузети 500 MB — 1 GB. Корисник ће открити проблем када систем прикаже упозорење о недостатку простора и обрисаће апликацију. Logback са RollingFileAppender-ом решава овај проблем: лимит од 5 MB са 3 архиве гарантује да логови никада неће заузети више од 20 MB.

Примери имплементације ротације на iOS и Android

Испод су примери подешавања ротације логова на обе платформе. На iOS-у се користи CocoaLumberjack, на Android-у — Logback са конфигурацијом кроз XML.

kotlin
// Logback на Android-у — конфигурација ротације у logback.xml
// Величина датотеке 5MB, 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 MB по апликацији.

Често постављана питања

Која је оптимална величина датотеке лога за ротацију?

За сервере — 100–500 MB, за мобилне апликације — 1–10 MB. Премали лимит (мање од 1 MB) изазива честу ротацију и непотребне I/O операције. Превелики лимит (више од 500 MB) повећава време отварања и претраге у датотеци.

Колико архивских копија логова чувати?

За продукцију — минимум 7 дана (дневна ротација) или 3–5 архива (ротација по величини). За захтеве усаглашености — 30–90 дана, али тада користите засебно складиште са компресијом и политиком чувања, а не ротацију на истој партицији.

Како logrotate ради на мобилним уређајима?

logrotate је Linux алат, недоступан на iOS и Android. На мобилним уређајима, ротацију имплементирају библиотеке: CocoaLumberjack за iOS и Logback за Android. Оне не захтевају root приступ и раде у sandbox окружењу апликације.

Шта радити ако се логови ротирају сваког минута?

Проверите да ли постоји циклично логовање — када обрада грешке сама генерише нову грешку. Додајте заштиту: бројач понављања логовања истог типа са прагом (не више од 100 истих порука у минути) и временском блокадом након прекорачења.

Да ли је обавезно компримовати архиве логова?

Није обавезно, али се препоручује. gzip компримује текст логова 10–20 пута без губитка података. На мобилним уређајима, компресија смањује заузети простор са 50 MB на 3–5 MB. Једини недостатак — архива се не може читати без декомпресије, али за анализу је обично потребна само тренутна датотека.

Закључак

  • Log Rotation — аутоматско управљање датотекама логова са креирањем нових датотека при достизању лимита и архивирањем старих ради спречавања препуњавања диска
  • Три стратегије — по величини датотеке (најраспрострањенија), по времену (за дампове) и по броју датотека (за мобилне уређаје са ограниченим простором)
  • logrotate — стандардни Linux алат за серверску ротацију са флексибилним параметрима: daily, size, compress, rotate, postrotate скрипте
  • Мобилне библиотеке — CocoaLumberjack на iOS-у и Logback на Android-у подржавају ротацију по величини са компресијом и ограничавањем броја архива
  • Диск квота — укупни лимит за све логове: 20 MB за мобилне апликације и 80% партиције за сервере са алармом при прекорачењу
  • Мониторинг — пречеста ротација (више од 10 пута на сат) указује на циклично логовање грешака или прекомерни обим логова
  • gzip компресија — смањује обим архива 10–20 пута, препоручује се за све платформе, delaycompress оставља последњу архиву некомпримовану за брзо читање

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође