Log Rotation — bu arxivlash, siqish va eski yozuvlarni o'chirish hisobiga diskning to'lib ketishining oldini oluvchi log fayllarini avtomatik boshqarish mexanizmidir. Mobil ilovalarda loglar foydalanuvchi qurilmasida to'planadi va rotatsiyasiz bir necha hafta foydalanishda gigabaytlab xotirani egallashi mumkin. Redis Documentation ma'lumotlariga ko'ra, log rotation-ni to'g'ri sozlash disk to'lishi sababli tizim ishdan chiqish xavfini nazoratsiz log o'sishi bilan solishtirganda 99% ga kamaytiradi. Asosiy rotatsiya strategiyalari: fayl hajmiga ko'ra, vaqtga ko'ra va fayllar soniga ko'ra — har biri foydalanish stsenariysiga qarab tanlanadi: logrotate Linux-da, CocoaLumberjack iOS-da va Timber Android-da uchala yondashuvni qo'llab-quvvatlaydi.
Asosiy fikrlar
Log Rotation — bu faol log faylining vaqti-vaqti bilan arxivlash, siqish yoki eskisini o'chirish orqali yangisiga almashtirilishi jarayonidir. Rotatsiyasiz bitta log fayli disk bo'limini to'liq to'ldirguncha cheksiz o'sadi, bu dasturning ishdan chiqishiga va ma'lumotlar yo'qolishiga olib keladi.
Oddiy stsenariy: dastur loglarni app.log fayliga yozadi. app.log 100 MB ga yetganda, tizim uni app.log.1 deb nomlaydi, app.log.1.gz ga siqadi va yangi bo'sh app.log yaratadi. Keyingi to'lishda app.log.1 app.log.2 ga aylanadi, app.log.1.gz app.log.2.gz ga aylanadi va eski app.log.2.gz o'chiriladi. Bu mexanizm keep count bilan rotatsiya deb ataladi — arxiv nusxalari soni barqaror.
Splunk ma'lumotlariga ko'ra (2023), noto'g'ri rotatsiya sozlamasi dastur serverlarida disk to'lishi bilan bog'liq hodisalarning 40% sababidir. Mobil qurilmalar uchun rotatsiya yanada muhim, chunki foydalanuvchi loglarni qo'lda boshqara olmaydi va boshqarmasligi kerak.
Log Rotation uchta asosiy strategiyani qo'llab-quvvatlaydi, ular birlashtirilishi mumkin. Strategiya tanlovi dastur turiga bog'liq: server tizimlari ko'pincha vaqt bo'yicha rotatsiyadan, mobil ilovalar — hajm bo'yicha, o'rnatilgan tizimlar — fayllar soni bo'yicha foydalanadi.
| Strategiya | Trigger | Qachon foydalaniladi |
|---|---|---|
| Hajm bo'yicha | Fayl N baytga yetdi | Bashorat qilib bo'lmaydigan log hajmi bo'lgan yuqori yuklamali tizimlar |
| Vaqt bo'yicha | N soat/kun o'tdi | Kunlik damplar, muvofiqlik talablari |
| Fayllar soni bo'yicha | N fayl yaratildi | Cheklangan disk maydoniga ega mobil qurilmalar |
Hajm bo'yicha rotatsiya hech qanday log faylining belgilangan limitdan oshmasligini kafolatlaydi. Limit mavjud disk maydoni va loglash chastotasiga qarab tanlanadi. Server uchun odatiy limit har bir fayl uchun 100–500 MB, mobil qurilma uchun 1–10 MB. Dastur intensiv loglasa, limitni kamaytirish kerak, aks holda rotatsiya har bir necha daqiqada sodir bo'ladi.
Vaqt bo'yicha rotatsiya log hajmiga bog'liq emas — fayl qat'iy jadval bo'yicha almashtiriladi. Loglar belgilangan kunlar davomida saqlanishi kerak bo'lgan tizimlar uchun qulay: keep count = 30 bilan kunlik rotatsiya 30 kun saqlashni anglatadi. Kamchiligi — intensiv yuk ostida bitta fayl kuniga gigabaytgacha o'sishi mumkin.
logrotate — loglarni avtomatik rotatsiya qilish uchun standart Linux yordamchi dasturi. U cron orqali ishga tushiriladi va /etc/logrotate.d/ papkasidagi konfiguratsiya fayllarini qayta ishlaydi. Har bir xizmat (nginx, postgresql, dastur) log yo'llari, rotatsiya strategiyasi va rotatsiyadan keyingi harakatlarni ko'rsatgan holda o'z konfigini yaratadi.
# /etc/logrotate.d/myapp — dastur loglarining rotatsiyasi
/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
}
Bu konfig loglarni kunlik rotatsiya qiladi, 7 arxiv nusxasini saqlaydi, eski fayllarni gzip bilan siqadi (oxirgisidan tashqari — delaycompress), log bo'lmasa xato bermaydi (missingok), bo'sh fayllarni rotatsiya qilmaydi (notifempty) va faylni 0640 ruxsatlari bilan qayta yaratadi. Rotatsiyadan so'ng postrotate skripti orqali dastur jarayoniga HUP signali yuboradi.
size — hajmga yetganda rotatsiya (size 100M). rotate — arxiv nusxalari soni (rotate 7). compress — gzip siqish. dateext — tartib raqami o'rniga fayl nomiga sana qo'shish. sharedscripts — postrotate-ni har bir fayl uchun alohida emas, balki barcha fayllar uchun bir marta bajarish. maxage — N kundan eski arxivlarni o'chirish.
Mobil qurilmalarda Log Rotation muhim, chunki foydalanuvchi fayl tizimini boshqarmaydi va dastur gigabaytlab log egallashini kutmaydi. iOS va Android ichki mexanizmlarga ega: iOS-da os_log doimiy o'lchamdagi halqali buferdan foydalanadi (qayta yozish orqali rotatsiya), Android Logcat yadroda cheklangan buferga ega.
iOS-da maxsus fayl loglari uchun CocoaLumberjack DDFileLogger sinfi bilan ishlatiladi, u hajm va vaqt bo'yicha rotatsiyani qo'llab-quvvatlaydi. Android-da — Logback yoki RollingFileAppender orqali o'z implementatsiyalar. Ikkala vosita maksimal fayl hajmi va arxivlar sonini belgilashga imkon beradi.
// CocoaLumberjack — iOS-da fayl rotatsiyasi
import CocoaLumberjack
let fileLogger = DDFileLogger()
fileLogger.maximumFileSize = 1024 * 1024 // 1 MB
fileLogger.logFileManager.maximumNumberOfLogFiles = 5
DDLog.add(fileLogger)
iOS: os_log rotatsiyani talab qilmaydi — xabarlar halqali buferda qayta yoziladi. Lekin dastur maxsus fayl loglarini yozsa (masalan, disk raskadrovka yoki serverga yuborish uchun), rotatsiyani qo'lda sozlash kerak. CocoaLumberjack iOS jamoalari uchun standart tanlovdir, u avtomatik ravishda arxivlarni .gz ga siqadi va limit oshib ketganda eski fayllarni o'chiradi.
Android dasturni o'z papkasiga log yozishda cheklamaydi. Dasturchi debug-log-larni rotatsiyasiz faylga yozsa, bir oylik faol foydalanishda ular 500 MB — 1 GB egallashi mumkin. Foydalanuvchi muammoni tizim joy yetmasligi haqida ogohlantirish ko'rsatganda aniqlaydi va dasturni o'chiradi. RollingFileAppender bilan Logback bu muammoni hal qiladi: 3 arxiv bilan 5 MB limiti loglarning hech qachon 20 MB dan ortiq joy egallamasligini kafolatlaydi.
Quyida ikkala platformada log rotatsiyasini sozlash misollari keltirilgan. iOS-da CocoaLumberjack, Android-da XML konfiguratsiya bilan Logback ishlatiladi.
// Android-da Logback — logback.xml da rotatsiya konfiguratsiyasi
// Fayl hajmi 5MB, 3 arxiv nusxasi
@file:Suppress("unused")
// Logback.xml da:
// <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-da nafaqat hajm bo'yicha rotatsiyani, balki logFileManager.maximumLogFiles orqali eski loglarni sana bo'yicha o'chirishni ham qo'llab-quvvatlaydi. maximumLogFiles = 0 qilib sozlasangiz, cheklov olib tashlanadi — loglar cheksiz to'planadi, bu production uchun xavfli.
// Umumiy hajmni tekshirish bilan maxsus rotatsiya
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 {
// Eng eski faylni o'chirmoqdamiz
files.sorted { $0.path < $1.path }.first.map {
try? FileManager.default.removeItem(at: $0)
}
}
}
}
Log Rotation nafaqat avtomatik arxivlash, balki tizim sog'lig'ining ko'rsatkichidir. Agar loglar juda tez-tez rotatsiya qilinsa (har bir necha daqiqada), bu haddan tashqari loglash yoki xatolarning tsiklik loglanishi (error log loop) signalidir. Rotatsiya chastotasiga ogohlantirishlar o'rnating: soatiga 10 dan ortiq rotatsiya — tekshirish uchun sabab.
Monitoring tizimlari (Prometheus, Grafana, Datadog) fayl tizimi eksportchilari orqali rotatsiya metrikalarini kuzatishi mumkin. Prometheus node_exporter fayl hajmi va ularning o'zgartirilgan vaqti metrikalarini taqdim etadi. Mobil qurilmalarda rotatsiya monitoringi odatda SDK-ga o'rnatilgan: CocoaLumberjack DDLog orqali rotatsiya hodisasini qayd etadi, Logback esa appender orqali status yuboradi.
Ogohlantirishlar: agar arxivlar kutilganidan ko'p bo'lsa (rotate count limitdan oshdi) yoki loglarning umumiy hajmi kvotadan oshib ketgan bo'lsa — tizim administratorga xabar berishi kerak. Serverlar uchun standart chegara bo'limning 80%, mobil qurilmalar uchun — dastur uchun 50 MB dan oshganda ogohlantirish.
Tez-tez beriladigan savollar
Serverlar uchun — 100–500 MB, mobil ilovalar uchun — 1–10 MB. Juda kichik limit (1 MB dan kam) tez-tez rotatsiyaga va ortiqcha kiritish-chiqarish operatsiyalariga sabab bo'ladi. Juda katta limit (500 MB dan ortiq) faylni ochish va qidirish vaqtini oshiradi.
Production uchun — minimal 7 kun (kunlik rotatsiya) yoki 3–5 arxiv (hajm bo'yicha rotatsiya). Muvofiqlik talablari uchun — 30–90 kun, lekin bu holda bir xil bo'limda rotatsiya emas, balki siqish va saqlash siyosati bilan alohida ombordan foydalaning.
logrotate Linux yordamchi dasturi bo'lib, iOS va Android-da mavjud emas. Mobil qurilmalarda rotatsiya kutubxonalar tomonidan amalga oshiriladi: iOS uchun CocoaLumberjack va Android uchun Logback. Ular root kirishni talab qilmaydi va dasturning sandbox muhitida ishlaydi.
Tsiklik loglash mavjudligini tekshiring — xatoni qayta ishlashning o'zi yangi xato yaratadi. Himoya qo'shing: bir turdagi takroriy loglash hisoblagichi chegara bilan (daqiqada 100 dan ortiq bir xil xabar bo'lmasligi kerak) va chegaradan oshganda vaqt blokirovkasi.
Majburiy emas, lekin tavsiya etiladi. gzip matn loglarini ma'lumot yo'qotmasdan 10–20 marta siqadi. Mobil qurilmalarda siqish egallangan joyni 50 MB dan 3–5 MB gacha kamaytiradi. Yagona kamchilik — arxivni ochmasdan o'qib bo'lmaydi, lekin tahlil uchun odatda faqat joriy fayl kerak bo'ladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.