Remote Logging adalah mekanisme pengiriman log dari perangkat mobile ke server jarak jauh untuk analisis dan pemantauan terpusat. Berbeda dengan logging lokal yang menyimpan data di perangkat, pengumpulan jarak jauh memungkinkan melihat kesalahan dan anomali dari semua perangkat pengguna secara real-time. Menurut Sentry Resource Library, aplikasi dengan remote logging menemukan 92% bug produksi dalam jam pertama setelah rilis dibandingkan 15% saat hanya menggunakan laporan crash. Ini adalah alat wajib bagi setiap tim pengembang mobile: Firebase Crashlytics, Sentry, dan Datadog menyediakan SDK siap pakai untuk iOS dan Android.
Poin Utama
Remote Logging adalah proses pengumpulan log dari perangkat jarak jauh dan pengirimannya ke server pusat untuk analisis. Dalam konteks pengembangan mobile, remote logging tidak hanya mencakup laporan crash (crash reporting), tetapi juga peristiwa kustom, breadcrumbs, metrik kinerja, dan skenario pengguna.
Perbedaan utama antara remote logging dan crash reporting adalah proaktivitas. Crash reporting hanya mengumpulkan data tentang crash aplikasi yang sudah terjadi. Remote logging mengumpulkan urutan peristiwa sebelum crash: layar apa yang dibuka pengguna, permintaan apa yang dibuat, data apa yang dimasukkan. Ini memungkinkan reproduksi skenario kesalahan tanpa berkomunikasi dengan pengguna.
Apple menyediakan mekanisme bawaan untuk pengumpulan log jarak jauh melalui .logarchive, tetapi untuk aplikasi produksi hampir selalu menggunakan layanan pihak ketiga. Android SDK menyertakan Logcat, yang dapat diakses jarak jauh melalui ADB, tetapi tidak untuk perangkat pengguna akhir tanpa mode debugging.
Arsitektur remote logging terdiri dari tiga komponen: SDK klien di perangkat yang mengumpulkan dan mem-buffer log, protokol transport untuk mengirim data, dan server untuk penyimpanan dan visualisasi.
| Komponen | Peran | Contoh |
|---|---|---|
| SDK Klien | Pengumpulan, buffering, batching | Firebase SDK, Sentry Cocoa, Timber |
| Transport | Transmisi data melalui HTTPS | REST, gRPC, WebSocket |
| Server | Penyimpanan, pengindeksan, peringatan | Sentry, Crashlytics, Datadog |
SDK klien me-buffer log di RAM dan secara periodik mengirimkannya ke server dalam batch. Jika perangkat offline, log disimpan dalam file lokal dan dikirim saat koneksi jaringan berikutnya. Ukuran buffer dan interval pengiriman dapat dikonfigurasi: nilai tipikal adalah 50 peristiwa atau 30 detik.
HTTPS REST — protokol paling umum untuk remote logging. SDK men-serialisasi log ke JSON dan mengirimkannya melalui permintaan POST ke endpoint server. gRPC — alternatif dengan serialisasi biner (Protocol Buffers), yang 30–40% lebih ringkas dari JSON dan lebih cepat di perangkat mobile dengan koneksi tidak stabil. WebSocket digunakan untuk logging real-time saat debugging, tetapi jarang di produksi karena konsumsi daya.
Firebase Crashlytics — layanan gratis Google untuk mengumpulkan laporan crash dan log kustom. Tertanam dalam Firebase SDK dan tidak memerlukan server terpisah. Crashlytics secara otomatis mengumpulkan stack trace, status perangkat, versi OS, dan layar yang terbuka pada saat crash.
Log kustom di Crashlytics ditambahkan melalui metode log() — mereka tidak langsung dikirim ke server, tetapi disimpan dalam buffer melingkar dan dilampirkan ke laporan crash berikutnya. Ini adalah perbedaan utama dari Sentry, di mana setiap log adalah peristiwa terpisah. Volume maksimum log kustom di Crashlytics adalah 64 KB per crash.
// Firebase Crashlytics — log kustom di 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 mendukung setUserIdentifier untuk menghubungkan crash dengan pengguna tertentu. Ini membantu menentukan apakah bug bersifat massal atau hanya mempengaruhi satu pengguna. setCustomKey menambahkan kunci arbitrer ke setiap laporan — versi pengujian A/B, wilayah, paket tarif.
Sentry — platform pemantauan kesalahan yang tidak hanya menyimpan laporan crash, tetapi juga semua peristiwa kustom (breadcrumbs) sebagai catatan independen. Tidak seperti Crashlytics, Sentry memungkinkan melihat urutan peristiwa sebelum kesalahan dalam urutan kronologis — breadcrumbs terlihat di antarmuka tanpa perlu merekonstruksinya dari log crash.
SDK Sentry secara otomatis mengumpulkan breadcrumbs untuk peristiwa sistem: perubahan siklus hidup UIViewController (viewDidLoad, viewWillAppear), sentuhan, klik tombol, permintaan HTTP melalui URLSession. Semua peristiwa ini ditampilkan di timeline kesalahan bersama dengan breadcrumbs kustom. Untuk Android, similarly dikumpulkan siklus hidup Activity dan Fragment, peristiwa onClick, dan permintaan jaringan melalui OkHttp.
SDK Sentry untuk iOS dan Android secara otomatis mengumpulkan breadcrumbs peristiwa UI: sentuhan, navigasi, siklus hidup. Pengembang dapat menambahkan breadcrumbs kustom melalui addBreadcrumb() dengan menentukan tipe, kategori, dan tingkat. Sentry mendukung distributed tracing: logger menghubungkan breadcrumbs di klien dengan permintaan backend melalui trace ID.
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 — sistem logging standar Android, dapat diakses melalui Android Debug Bridge (ADB). Logcat mengumpulkan semua pesan sistem dan aplikasi, dibagi berdasarkan level (V, D, I, W, E, F) dan tag. Akses jarak jauh ke Logcat bekerja melalui ADB melalui USB atau Wi-Fi, tetapi hanya untuk perangkat dalam mode debugging — aplikasi produksi di perangkat tanpa koneksi USB tidak dapat diakses.
Untuk logging jarak jauh di produksi pada Android, digunakan alternatif: Logcat sendiri tidak dapat mengirim log ke server. Perannya adalah diagnostik lokal. Namun ada wrapper (Timber, LogcatLive) yang meneruskan pesan ke Firebase atau Sentry, mempertahankan API Log.d / Log.e yang familiar. Timber memungkinkan mengganti handler tanpa mengubah kode aplikasi — pohon debug menulis ke Logcat, pohon release mengirim ke server dengan batching dan kompresi.
Batching — pengelompokan beberapa log dalam satu permintaan HTTP untuk menghemat lalu lintas dan baterai. Alih-alih 50 permintaan POST terpisah, SDK mengirim satu array JSON. Strategi tipikal: pengiriman terjadwal (setiap 30 detik), berdasarkan jumlah (setiap 50 peristiwa), atau berdasarkan peristiwa (hanya pada kesalahan kritis).
Untuk aplikasi dengan jutaan pengguna, volume log dapat mencapai terabyte per hari. Batching mengurangi jumlah permintaan 10–50 kali lipat dan menurunkan beban server. Sentry menggunakan kompresi gzip di tingkat transport, yang selanjutnya mengurangi volume data sebesar 60–70%.
// Implementasi sederhana batching di 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 — metode kompresi standar untuk transmisi log HTTP. SDK Sentry dan Crashlytics secara otomatis mengompresi body permintaan sebelum pengiriman. Deduplikasi — penghapusan pesan berulang di sisi klien: jika peristiwa yang sama tertangkap 100 kali per detik, SDK mengirimkannya sekali dengan field count = 100.
Kesalahan paling umum — mencatat data sensitif. Remote logging SDK mengirim data ke server, dan jika pengembang secara tidak sengaja mencatat kata sandi, token, atau email pengguna, data ini berakhir di infrastruktur cloud. Selalu gunakan filtrasi PII (Personally Identifiable Information) di tingkat SDK: Sentry memiliki hook beforeSend bawaan untuk membersihkan data sebelum pengiriman.
Masalah umum kedua — logging berlebihan. Jika setiap gerakan jari dikirim ke server, volume data tumbuh secara eksponensial, dan biaya server juga meningkat. Tetapkan anggaran untuk log: tidak lebih dari 1–5 peristiwa per pengguna per menit di produksi. Log debug kirim hanya dengan flag yang diaktifkan untuk perangkat tertentu.
Kesalahan ketiga — mengabaikan skenario offline. Jika SDK kehilangan log saat tidak ada jaringan dan tidak memulihkannya saat koneksi ulang, remote logging tidak berguna bagi pengguna dengan koneksi tidak stabil. Semua SDK (Firebase, Sentry) secara otomatis men-cache log di file lokal dan mengirim saat jaringan tersedia, tetapi pengaturan ini perlu diverifikasi.
Pertanyaan Umum
Crash reporting hanya mengumpulkan informasi tentang crash aplikasi. Remote Logging mengumpulkan semua peristiwa: log kustom, breadcrumbs, metrik kinerja, peristiwa UI. Crash reporting adalah subset dari remote logging, bukan alternatifnya.
Crashlytics gratis dan cukup untuk laporan crash dasar. Sentry lebih baik jika Anda membutuhkan breadcrumbs, distributed tracing, dashboard kustom, dan peringatan fleksibel. Untuk proyek enterprise dengan persyaratan kepatuhan, Sentry tersedia dalam versi self-hosted.
Gunakan tingkat logging: kirim log debug/info hanya dari perangkat pengembang melalui flag isDebuggable. Level lainnya (warn, error) filter melalui beforeSend-hook, hapus bidang yang mengandung PII. Tetapkan ukuran log maksimum per sesi.
Logcat tidak mendukung pengiriman jarak jauh ke server. Untuk remote logging di Android, gunakan Timber untuk meneruskan ke Firebase atau Sentry, dan biarkan Logcat untuk debugging melalui USB. Timber menggantikan Android Log API dan menambahkan pohon yang dapat ditanam.
Hingga 50 peristiwa per menit per perangkat tidak memengaruhi konsumsi baterai secara signifikan, jika menggunakan batching (pengiriman dalam batch, bukan satu per satu). Pada 200+ peristiwa per menit, Wi-Fi/modem akan terus aktif — baterai habis 15–25% lebih cepat.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga