Remote Logging — mobil qurilmadagi loglarni markazlashtirilgan tahlil va monitoring uchun masofaviy serverga jo'natish mexanizmi. Ma'lumotlarni qurilmada saqlaydigan mahalliy loglashdan farqli o'laroq, masofaviy yig'ish barcha foydalanuvchi qurilmalaridagi xato va anomaliyalarni real vaqtda ko'rish imkonini beradi. Sentry Resource Library ma'lumotlariga ko'ra, remote logging-ga ega ilovalar chiqarilgandan so'ng birinchi soat ichida ishlab chiqarish xatolarining 92 foizini topadi, faqat crash hisobotlaridan foydalanganda esa 15 foizni. Bu har bir mobil ishlab chiqish jamoasi uchun majburiy vositadir: Firebase Crashlytics, Sentry va Datadog iOS va Android uchun tayyor SDK-larni taqdim etadi.
Asosiy ma'lumotlar
Remote Logging — masofaviy qurilmalardan loglarni yig'ish va tahlil qilish uchun markaziy serverga jo'natish jarayoni. Mobil ishlab chiqish kontekstida remote logging nafaqat krash hisobotlarini (crash reporting), balki maxsus hodisalar, breadcrumbs, ishlash metrikalari va foydalanuvchi stsenariylarini ham o'z ichiga oladi.
Remote logging-ni crash reporting-dan asosiy farqi proaktivlikdir. Crash reporting faqat allaqachon sodir bo'lgan ilova qulashlari haqida ma'lumotlarni yig'adi. Remote logging krashdan oldingi hodisalar ketma-ketligini yig'adi: foydalanuvchi qaysi ekranlarni ochgani, qanday so'rovlarni yuborgani, qanday ma'lumotlarni kiritgani. Bu foydalanuvchi bilan bog'lanmasdan xato stsenariysini qayta tiklash imkonini beradi.
Apple .logarchive orqali masofaviy log yig'ish uchun o'rnatilgan mexanizmni taqdim etadi, ammo ishlab chiqarish ilovalari uchun deyarli har doim uchinchi tomon xizmatlaridan foydalaniladi. Android SDK ADB orqali masofadan foydalanish mumkin bo'lgan Logcat-ni o'z ichiga oladi, lekin tuzatish rejimisiz oxirgi foydalanuvchi qurilmalari uchun emas.
Remote logging arxitekturasi uch komponentdan iborat: loglarni yig'adigan va buferlaydigan qurilmadagi mijoz SDK, ma'lumotlarni jo'natish uchun transport protokoli va saqlash va vizuallashtirish uchun server.
| Komponent | Rol | Misollar |
|---|---|---|
| Mijoz SDK | Yig'ish, buferlash, batching | Firebase SDK, Sentry Cocoa, Timber |
| Transport | Ma'lumotlarni HTTPS orqali uzatish | REST, gRPC, WebSocket |
| Server | Saqlash, indekslash, ogohlantirishlar | Sentry, Crashlytics, Datadog |
Mijoz SDK loglarni operativ xotirada buferlaydi va davriy ravishda ularni serverga partiyalar (batches) shaklida jo'natadi. Agar qurilma oflayn bo'lsa, loglar mahalliy faylda saqlanadi va keyingi tarmoqqa ulanishda jo'natiladi. Bufer hajmi va jo'natish oralig'i sozlanishi mumkin: odatiy qiymatlar 50 ta hodisa yoki 30 soniya.
HTTPS REST — remote logging uchun eng keng tarqalgan protokol. SDK loglarni JSON-ga seriyalashtiradi va server endpoint-iga POST so'rovlari bilan jo'natadi. gRPC — ikkilik seriyalash (Protocol Buffers) bilan muqobil, JSON-dan 30–40% ixchamroq va beqaror aloqaga ega mobil qurilmalarda tezroq. WebSocket tuzatish vaqtida real-vaqt loglash uchun ishlatiladi, lekin energiya iste'moli tufayli ishlab chiqarishda kam qo'llaniladi.
Firebase Crashlytics — krash hisobotlari va maxsus loglarni yig'ish uchun Google-ning bepul xizmati. Firebase SDK-ga o'rnatilgan va alohida server talab qilmaydi. Crashlytics avtomatik ravishda stack trace, qurilma holati, operatsion tizim versiyasi va qulash paytida ochiq ekranlarni yig'adi.
Crashlytics-da maxsus loglar log() metodi orqali qo'shiladi — ular darhol serverga yuborilmaydi, balki halqa buferida saqlanadi va keyingi krash hisobotiga ilova qilinadi. Bu har bir log alohida hodisa bo'lgan Sentry-dan asosiy farqdir. Crashlytics-da maxsus loglarning maksimal hajmi bitta krash uchun 64 KB.
// Firebase Crashlytics — Android-da maxsus loglar
import com.google.firebase.crashlytics.FirebaseCrashlytics
class CheckoutViewModel {
fun processPayment(amount: Double) {
FirebaseCrashlytics.getInstance()
.log("Payment started: amount=$amount")
try {
process(amount)
} catch (e: Exception) {
FirebaseCrashlytics.getInstance()
.recordException(e)
}
}
}
Firebase Crashlytics krashlarni aniq foydalanuvchilar bilan bog'lash uchun setUserIdentifier-ni qo'llab-quvvatlaydi. Bu xato ommaviy yoki faqat bitta foydalanuvchiga ta'sir qilishini aniqlashga yordam beradi. setCustomKey har bir hisobotga ixtiyoriy kalitlarni qo'shadi — A/B test versiyasi, mintaqa, tarif rejasi.
Sentry — nafaqat krash hisobotlarini, balki barcha maxsus hodisalarni (breadcrumbs) mustaqil yozuvlar sifatida saqlaydigan xato monitoring platformasi. Crashlytics-dan farqli o'laroq, Sentry xatodan oldingi hodisalar ketma-ketligini xronologik tartibda ko'rish imkonini beradi — breadcrumbs interfeysda ko'rinadi va ularni krash logidan tiklash talab qilinmaydi.
Sentry SDK tizim hodisalari uchun avtomatik breadcrumbs yig'adi: UIViewController hayot sikli o'zgarishlari (viewDidLoad, viewWillAppear), touches, tugma bosishlari, URLSession orqali HTTP so'rovlari. Bu hodisalarning barchasi maxsus breadcrumbs bilan birga xato vaqt chizig'ida ko'rsatiladi. Android uchun xuddi shunday Activity va Fragment lifecycle, onClick hodisalari va OkHttp orqali tarmoq so'rovlari yig'iladi.
iOS va Android uchun Sentry SDK UI hodisalarining breadcrumbs-ni avtomatik yig'adi: touches, navigatsiya, lifecycle. Dasturchi addBreadcrumb() orqali turi, toifasi va darajasi ko'rsatilgan holda maxsus breadcrumbs qo'shishi mumkin. Sentry distributed tracing-ni qo'llab-quvvatlaydi: logger breadcrumbs-ni mijozda trace ID orqali backend so'rovlari bilan bog'laydi.
import Sentry
func trackCartEvent(action: String, itemId: String) {
let crumb = Breadcrumb()
crumb.level = .info
crumb.category = "cart"
crumb.message = "Cart \(action): \(itemId)"
crumb.data = ["action": action, "item_id": itemId]
SentrySDK.addBreadcrumb(crumb)
}
Logcat — Android Debug Bridge (ADB) orqali foydalanish mumkin bo'lgan standart Android loglash tizimi. Logcat darajalar (V, D, I, W, E, F) va teglar bo'yicha ajratilgan barcha tizim va ilova xabarlarini yig'adi. Logcat-ga masofaviy kirish ADB orqali USB yoki Wi-Fi orqali ishlaydi, lekin faqat tuzatish rejimidagi qurilmalar uchun — USB ulanishisiz qurilmalardagi ishlab chiqarish ilovalari mavjud emas.
Android-da ishlab chiqarishda masofaviy loglash uchun muqobil variantlardan foydalaniladi: Logcat o'z-o'zidan loglarni serverga jo'nata olmaydi. Uning roli mahalliy diagnostika. Ammo Timber, LogcatLive kabi o'rashlar mavjud bo'lib, ular xabarlarni Firebase yoki Sentry-ga yo'naltiradi, tanish Log.d / Log.e API-ni saqlaydi. Timber dastur kodini o'zgartirmasdan handler-larni almashtirish imkonini beradi — debug daraxti Logcat-ga yozadi, release daraxti batching va siqish bilan serverga jo'natadi.
Batching — trafik va batareyani tejash uchun bir nechta loglarni bitta HTTP so'rovida guruhlash. 50 ta alohida POST so'rovi o'rniga, SDK bitta JSON massivini jo'natadi. Odatiy strategiyalar: jadval bo'yicha jo'natish (har 30 soniyada), soni bo'yicha (har 50 hodisada) yoki hodisa bo'yicha (faqat tanqidiy xatoda).
Millionlab foydalanuvchilari bo'lgan ilovalar uchun loglar hajmi kuniga terabaytlarga yetishi mumkin. Batching so'rovlar sonini 10–50 marta kamaytiradi va server yukini pasaytiradi. Sentry transport darajasida gzip siqishdan foydalanadi, bu esa ma'lumot hajmini qo'shimcha 60–70% ga kamaytiradi.
// Android-da batching ning oddiy amalga oshirilishi
class LogBatcher {
private val buffer = mutableListOf<LogEvent>()
private val maxSize = 50
private val intervalMs = 30_000L
fun append(event: LogEvent) {
buffer.add(event)
if (buffer.size >= maxSize) flush()
}
suspend fun flush() {
val batch = buffer.toList()
buffer.clear()
sendToServer(batch)
}
}
gzip — loglarni HTTP uzatish uchun standart siqish usuli. Sentry va Crashlytics SDK-lari jo'natishdan oldin so'rov tanasini avtomatik siqadi. Deduplikatsiya — mijoz tomonida takrorlanuvchi xabarlarni olib tashlash: agar bir xil hodisa sekundiga 100 marta tutilsa, SDK uni count = 100 maydoni bilan bir marta jo'natadi.
Eng keng tarqalgan xato — nozik ma'lumotlarni loglash. Remote logging SDK ma'lumotlarni serverga uzatadi va agar dasturchi tasodifan foydalanuvchi parolini, tokenini yoki elektron pochta manzilini loglasa, bu ma'lumotlar bulut infratuzilmasiga tushadi. Har doim SDK darajasida PII (Shaxsni Aniqlovchi Ma'lumot) filtrlashdan foydalaning: Sentry jo'natishdan oldin ma'lumotlarni tozalash uchun o'rnatilgan beforeSend-hook-ga ega.
Ikkinchi keng tarqalgan muammo — haddan tashqari loglash. Agar barmoqning har bir harakati serverga jo'natilsa, ma'lumot hajmi eksponensial ravishda oshadi, server xarajatlari ham oshadi. Loglar uchun byudjet belgilang: ishlab chiqarishda foydalanuvchi boshiga daqiqada 1–5 ta hodisadan ko'p bo'lmasligi kerak. Debug loglarini faqat ma'lum qurilmalar uchun yoqiladigan flag bilan jo'natish kerak.
Uchinchi xato — oflayn stsenariyni e'tiborsiz qoldirish. Agar tarmoq bo'lmaganda SDK loglarni yo'qotsa va qayta ulanganda ularni tiklamasa, remote logging beqaror aloqaga ega foydalanuvchilar uchun foydasiz. Barcha SDK-lar (Firebase, Sentry) loglarni avtomatik ravishda mahalliy faylda keshlaydi va tarmoq paydo bo'lganda jo'natadi, ammo bu sozlamani tekshirish kerak.
Tez-tez beriladigan savollar
Crash reporting faqat ilova qulashlari haqida ma'lumot yig'adi. Remote Logging barcha hodisalarni yig'adi: maxsus loglar, breadcrumbs, ishlash metrikalari, UI hodisalari. Crash reporting remote logging-ning kichik to'plamidir, uning muqobili emas.
Crashlytics bepul va asosiy krash hisobotlari uchun yetarli. Sentry yaxshiroq, agar breadcrumbs, distributed tracing, maxsus dashboardlar va moslashuvchan ogohlantirishlar kerak bo'lsa. Compliance talablari bo'lgan enterprise loyihalar uchun Sentry self-hosted versiyasida mavjud.
Loglash darajalaridan foydalaning: debug/info loglarini faqat isDebuggable flagi bo'lgan dasturchi qurilmasidan jo'nating. Qolgan darajalarni (warn, error) beforeSend-hook orqali filtrlash, PII bo'lgan maydonlarni olib tashlash kerak. Sessiya uchun maksimal log hajmini belgilang.
Logcat serverga masofaviy jo'natishni qo'llab-quvvatlamaydi. Android-da remote logging uchun Firebase yoki Sentry-ga yo'naltirish uchun Timber-dan foydalaning, Logcat-ni esa USB orqali tuzatish uchun qoldiring. Timber Android Log API-ni almashtiradi va ekiladigan daraxtlar qo'shadi.
Qurilmada daqiqada 50 ta hodisagacha batareya sarfiga sezilarli ta'sir ko'rsatmaydi, agar batching ishlatilsa (partiyalarda jo'natish, yakka-yakka emas). Daqiqada 200+ hodisada Wi-Fi/modem doimiy faol bo'ladi — batareya 15–25% tezroq zaryadsizlanadi.
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.