Remote Logging — шта је то, алати за прикупљање и начини даљинске анализе логова

Аутор: IT Sectr Објављено: 2026-05-28 Време читања: 8 мин

Remote Logging је механизам слања логова са мобилног уређаја на удаљени сервер ради централизоване анализе и надзора. За разлику од локалног логирања, које чува податке на уређају, даљинско прикупљање омогућава увид у грешке и аномалије са свих уређаја корисника у реалном времену. Према Sentry Resource Library, апликације са remote logging проналазе 92% production багова у првом сату након објављивања, наспрам 15% када се користе само crash извештаји. Ово је обавезан алат за сваки тим мобилних програмера: Firebase Crashlytics, Sentry и Datadog пружају готове SDK за iOS и Android.

Главно

  • Remote Logging — пренос логова са уређаја на сервер ради централизованог надзора и анализе production грешака
  • Firebase Crashlytics — бесплатни Google сервис за прикупљање крашева и прилагођених логова на Android и iOS
  • Sentry — платформа за надзор грешака са подршком за breadcrumbs, контекст корисника и distributed tracing
  • Logcat — стандардни Android систем логирања, доступан даљински преко ADB и Android Studio
  • Batching — груписање логова на уређају и слање у пакетима ради уштеде батерије и саобраћаја

Шта је Remote Logging

Remote Logging је процес прикупљања логова са удаљених уређаја и њиховог слања на централни сервер ради анализе. У контексту мобилног развоја, remote logging укључује не само crash извештаје (crash reporting), већ и прилагођене догађаје, breadcrumbs, метрике перформанси и корисничке сценарије.

Главна разлика између remote logging и crash reporting је проактивност. Crash reporting прикупља само податке о падовима апликације који су се већ догодили. Remote logging прикупља секвенцу догађаја пре краша: које екране је корисник отварао, које захтеве је слао, које податке је уносио. Ово омогућава репродукцију сценарија грешке без контакта са корисником.

Apple пружа уграђени механизам даљинског прикупљања логова преко .logarchive, али се за production апликације готово увек користе спољни сервиси. Android SDK укључује Logcat, који је даљински доступан преко ADB, али не за уређаје крајњих корисника без debug режима.

Архитектура даљинског прикупљања логова

Архитектура remote logging се састоји од три компоненте: клијентског SDK на уређају, који прикупља и баферише логове, транспортног протокола за слање података и сервера за складиштење и визуелизацију.

КомпонентаУлогаПримери
Клијентски SDKПрикупљање, баферисање, batchingFirebase SDK, Sentry Cocoa, Timber
ТранспортПренос података преко HTTPSREST, gRPC, WebSocket
СерверСкладиштење, индексирање, алертиSentry, Crashlytics, Datadog

Клијентски SDK баферише логове у RAM меморији и периодично их шаље на сервер у пакетима (batches). Ако је уређај offline, логови се чувају у локалној датотеци и шаљу при следећем повезивању на мрежу. Величина бафера и интервал слања су подесиви: типичне вредности су 50 догађаја или 30 секунди.

Транспортни протоколи

HTTPS REST — најраспрострањенији протокол за remote logging. SDK серијализује логове у JSON и шаље POST захтевима на endpoint сервера. gRPC — алтернатива са бинарном серијализацијом (Protocol Buffers), која је 30–40% компактнија од JSON и бржа на мобилним уређајима са нестабилном везом. WebSocket се користи за логирање у реалном времену при debug-овању, али ретко у production-у због потрошње енергије.

Firebase Crashlytics: прикупљање крашева и логова

Firebase Crashlytics — бесплатни Google сервис за прикупљање crash извештаја и прилагођених логова. Уграђен је у Firebase SDK и не захтева посебан сервер. Crashlytics аутоматски прикупља stack trace, стање уређаја, верзију оперативног система и отворене екране у тренутку пада.

Прилагођени логови у Crashlytics се додају преко методе log() — они се не шаљу одмах на сервер, већ се чувају у кружном баферу и прилажу следећем crash извештају. Ово је кључна разлика у односу на Sentry, где је сваки лог засебан догађај. Максимална величина прилагођених логова у Crashlytics је 64 KB по крашу.

kotlin
// Firebase Crashlytics — прилагођени логови на Android-у
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 подржава setUserIdentifier за повезивање крашева са конкретним корисницима. Ово помаже да се утврди да ли је баг масовни или погађа само једног корисника. setCustomKey додаје произвољне кључеве сваком извештају — верзију A/B теста, регион, тарифни план.

Sentry: breadcrumbs и контекст корисника

Sentry — платформа за надзор грешака која чува не само crash извештаје, већ и све прилагођене догађаје (breadcrumbs) као самосталне записе. За разлику од Crashlytics, Sentry омогућава преглед секвенце догађаја пре грешке у хронолошком редоследу — breadcrumbs су видљиви у интерфејсу без потребе за реконструкцијом из crash лога.

Аутоматски breadcrumbs у Sentry

Sentry SDK аутоматски прикупља breadcrumbs за системске догађаје: промене животног циклуса UIViewController (viewDidLoad, viewWillAppear), touches, кликове на дугмад, HTTP захтеве преко URLSession. Сви ови догађаји се приказују на временској линији грешке заједно са прилагођеним breadcrumbs. За Android се на сличан начин прикупљају lifecycle Activity и Fragment, onClick догађаји и мрежни захтеви преко OkHttp.

Sentry SDK за iOS и Android аутоматски прикупља breadcrumbs UI догађаја: touches, навигација, lifecycle. Програмер може додавати прилагођене breadcrumbs преко addBreadcrumb() са навођењем типа, категорије и нивоа. Sentry подржава distributed tracing: логер повезује breadcrumbs на клијенту са захтевима на backend-у преко trace ID.

swift
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 и даљински приступ преко ADB

Logcat — стандардни Android систем логирања, доступан преко Android Debug Bridge (ADB). Logcat прикупља све системске и апликативне поруке, подељене по нивоима (V, D, I, W, E, F) и ознакама. Даљински приступ Logcat-у ради преко ADB преко USB или Wi-Fi, али само за уређаје у debug режиму — production апликације на уређајима без USB везе нису доступне.

За даљинско логирање у production-у на Android-у користе се алтернативе: Logcat сам по себи не уме да шаље логове на сервер. Његова улога је локална дијагностика. Али постоје омотачи (Timber, LogcatLive) који прослеђују поруке у Firebase или Sentry, чувајући познати API Log.d / Log.e. Timber омогућава пребацивање између handler-а без промене кода апликације — debug дрво пише у Logcat, release дрво шаље на сервер са batch-овањем и компресијом.

Batching и оптимизација саобраћаја

Batching — груписање више логова у један HTTP захтев ради уштеде саобраћаја и батерије. Уместо 50 одвојених POST захтева, SDK шаље један JSON низ. Типичне стратегије: слање по распореду (сваких 30 секунди), по броју (сваких 50 догађаја) или по догађају (само при критичној грешци).

За апликације са милионима корисника, обим логова може достићи терабајте дневно. Batching смањује број захтева 10–50 пута и смањује оптерећење сервера. Sentry користи gzip компресију на транспортном нивоу, што додатно смањује обим података за 60–70%.

kotlin
// Једноставна имплементација batch-овања на Android-у
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 — стандардни метод компресије за HTTP пренос логова. Sentry и Crashlytics SDK аутоматски компресују тело захтева пре слања. Дедупликација — уклањање понављајућих порука на страни клијента: ако се исти догађај ухвати 100 пута у секунди, SDK га шаље једном са пољем count = 100.

Типичне грешке даљинског логирања

Најчешћа грешка — логирање осетљивих података. Remote logging SDK преноси податке на сервер, и ако програмер случајно логира лозинку, токен или email корисника, ови подаци доспевају у облачну инфраструктуру. Увек користите PII (Lični identifikacioni podaci) филтрацију на нивоу SDK: Sentry има уграђени beforeSend-hook за чишћење података пре слања.

Други чест проблем — прекомерно логирање. Ако се сваки покрет прста шаље на сервер, обим података расте експоненцијално, а трошкови сервера такође. Одредите буџет за логове: не више од 1–5 догађаја по кориснику у минути у production-у. Debug логове шаљите само са флагом која се укључује за одређене уређаје.

Трећа грешка — игнорисање offline сценарија. Ако SDK губи логове при недостатку мреже и не обнавља их при поновном повезивању, remote logging је бескористан за кориснике са нестабилном везом. Сви SDK (Firebase, Sentry) аутоматски кеширају логове у локалну датотеку и шаљу при појави мреже, али ову поставку треба проверити.

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

По чему се Remote Logging разликује од crash reporting?

Crash reporting прикупља само информације о падовима апликације. Remote Logging прикупља све догађаје: прилагођене логове, breadcrumbs, метрике перформанси, UI догађаје. Crash reporting је подскуп remote logging, а не његова алтернатива.

Који сервис одабрати: Firebase Crashlytics или Sentry?

Crashlytics је бесплатан и довољан за основне crash извештаје. Sentry је бољи ако су вам потребни breadcrumbs, distributed tracing, прилагођене контролне табле и флексибилни алерти. За enterprise пројекте са compliance захтевима, Sentry је доступан у self-hosted верзији.

Како не логирати сувишне податке у production-у?

Користите нивое логирања: debug/info логове шаљите само са програмерског уређаја преко isDebuggable флага. Остале нивое (warn, error) филтрирајте кроз beforeSend-hook, уклањајући поља која садрже PII. Одредите максималну величину лога по сесији.

Може ли се Logcat користити за даљинско прикупљање логова?

Logcat не подржава даљинско слање на сервер. За remote logging на Android-у користите Timber за прослеђивање у Firebase или Sentry, а Logcat оставите за debug преко USB. Timber замењује Android Log API и додаје садиве дрвореде.

Колико логова се може слати без утицаја на батерију?

До 50 догађаја у минути на уређај не утиче приметно на потрошњу батерије, ако се користи batching (слање у пакетима, не појединачно). При 200+ догађаја у минути, Wi-Fi/модем ће бити стално активан — батерија се празни 15–25% брже.

Закључак

  • Remote Logging — пренос логова са мобилног уређаја на сервер ради централизоване анализе, укључујући crash извештаје, breadcrumbs и метрике перформанси
  • Firebase Crashlytics — бесплатни Google сервис са прилагођеним логовима у кружном баферу, прикаченим уз crash извештаје
  • Sentry — платформа са независним breadcrumbs и distributed tracing, омогућава преглед секвенце догађаја пре грешке без реконструкције из crash лога
  • Batching — груписање 50+ догађаја у један захтев са gzip компресијом, смањује саобраћај и оптерећење сервера 10–50 пута
  • PII филтрација — обавезно чишћење осетљивих података кроз beforeSend-hook ради спречавања цурења личних података на сервер
  • Буџет логирања — не више од 1–5 догађаја по кориснику у минути у production-у, debug логови само са isDebuggable флагом на одређеним уређајима

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

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

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

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