Log Rotation је механизам аутоматског управљања датотекама логова који спречава препуњавање диска архивирањем, компресијом и брисањем старих записа. У мобилним апликацијама, логови се накупљају на уређају корисника, а без ротације могу заузети гигабајте меморије за неколико недеља коришћења. Према Redis Documentation, правилно подешавање log rotation смањује ризик од отказивања система због попуњеног диска за 99% у поређењу са неконтролисаним растом логова. Главне стратегије ротације: по величини датотеке, по времену и по броју датотека — свака се бира у зависности од сценарија употребе: logrotate у Linux-у, CocoaLumberjack на iOS-у и Timber на Android-у подржавају сва три приступа.
Главне тачке
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 алат за аутоматску ротацију логова. Покреће се преко cron-а и обрађује конфигурационе датотеке из /etc/logrotate.d/. Сваки сервис (nginx, postgresql, апликација) креира свој конфиг са путањама до логова, стратегијом ротације и акцијама након ротације.
# /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 скрипту.
size — ротација по достизању величине (size 100M). rotate — број архивских копија (rotate 7). compress — gzip компресија. dateext — додавање датума у име датотеке уместо редног броја. sharedscripts — извршавање postrotate једном за све датотеке, а не за сваку појединачно. maxage — брисање архива старијих од N дана.
На мобилним уређајима, Log Rotation је критична јер корисник не управља системом датотека и не очекује да ће апликација заузети гигабајте логовима. iOS и Android имају уграђене механизме: os_log на iOS-у користи кружни бафер фиксне величине (ротација преписивањем), Android Logcat има ограничен бафер у језгру.
За прилагођене логове датотека на iOS-у користи се CocoaLumberjack са класом DDFileLogger, који подржава ротацију по величини и времену. На Android-у — Logback или сопствене имплементације кроз RollingFileAppender. Оба алата омогућавају подешавање максималне величине датотеке и броја архива.
// 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 не ограничава апликацију у упису логова у сопствени директоријум. Ако програмер пише debug логове у датотеку без ротације, за месец дана активног коришћења могу заузети 500 MB — 1 GB. Корисник ће открити проблем када систем прикаже упозорење о недостатку простора и обрисаће апликацију. Logback са RollingFileAppender-ом решава овај проблем: лимит од 5 MB са 3 архиве гарантује да логови никада неће заузети више од 20 MB.
Испод су примери подешавања ротације логова на обе платформе. На iOS-у се користи CocoaLumberjack, на Android-у — Logback са конфигурацијом кроз XML.
// 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.
// Прилагођена ротација са провером укупног обима
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 је Linux алат, недоступан на iOS и Android. На мобилним уређајима, ротацију имплементирају библиотеке: CocoaLumberjack за iOS и Logback за Android. Оне не захтевају root приступ и раде у sandbox окружењу апликације.
Проверите да ли постоји циклично логовање — када обрада грешке сама генерише нову грешку. Додајте заштиту: бројач понављања логовања истог типа са прагом (не више од 100 истих порука у минути) и временском блокадом након прекорачења.
Није обавезно, али се препоручује. gzip компримује текст логова 10–20 пута без губитка података. На мобилним уређајима, компресија смањује заузети простор са 50 MB на 3–5 MB. Једини недостатак — архива се не може читати без декомпресије, али за анализу је обично потребна само тренутна датотека.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође