Remote Logging, mobil cihazdan uzak bir sunucuya merkezi analiz ve izleme için log gönderme mekanizmasıdır. Verileri cihazda depolayan yerel loglamanın aksine, uzaktan toplama, tüm kullanıcı cihazlarından hataları ve anormallikleri gerçek zamanlı olarak görmeyi sağlar. Sentry Resource Library'ye göre, remote logging kullanan uygulamalar, yalnızca crash raporları kullanıldığında %15'e karşılık, sürümden sonraki ilk saat içinde üretim hatalarının %92'sini bulur. Bu, herhangi bir mobil geliştirme ekibi için zorunlu bir araçtır: Firebase Crashlytics, Sentry ve Datadog, iOS ve Android için hazır SDK'lar sağlar.
Ana noktalar
Remote Logging, uzak cihazlardan log toplama ve analiz için merkezi bir sunucuya iletme sürecidir. Mobil geliştirme bağlamında, remote logging yalnızca crash raporlarını değil, aynı zamanda özel etkinlikleri, breadcrumbs'ları, performans metriklerini ve kullanıcı senaryolarını da içerir.
Remote logging ile crash reporting arasındaki temel fark proaktifliktir. Crash reporting yalnızca daha önce meydana gelmiş uygulama çökmeleri hakkında veri toplar. Remote logging, çökmeden önceki olay dizisini toplar: kullanıcının hangi ekranları açtığı, hangi istekleri yaptığı, hangi verileri girdiği. Bu, kullanıcıyla iletişim kurmadan hata senaryosunu yeniden oluşturmayı sağlar.
Apple, .logarchive aracılığıyla uzaktan log toplama için yerleşik bir mekanizma sağlar, ancak üretim uygulamaları için neredeyse her zaman üçüncü taraf hizmetler kullanılır. Android SDK, ADB üzerinden uzaktan erişilebilen Logcat'i içerir, ancak hata ayıklama modu olmayan son kullanıcı cihazları için geçerli değildir.
Remote logging mimarisi üç bileşenden oluşur: cihazdaki istemci SDK'sı (logları toplar ve arabelleğe alır), veri göndermek için taşıma protokolü ve depolama ile görselleştirme için sunucu.
| Bileşen | Rol | Örnekler |
|---|---|---|
| İstemci SDK | Toplama, arabelleğe alma, toplu gönderme | Firebase SDK, Sentry Cocoa, Timber |
| Taşıma | HTTPS üzerinden veri iletimi | REST, gRPC, WebSocket |
| Sunucu | Depolama, indeksleme, uyarılar | Sentry, Crashlytics, Datadog |
İstemci SDK, logları RAM'de arabelleğe alır ve periyodik olarak gruplar halinde sunucuya gönderir. Cihaz çevrimdışıysa, loglar yerel bir dosyaya kaydedilir ve bir sonraki ağ bağlantısında gönderilir. Arabellek boyutu ve gönderme aralığı yapılandırılabilir: tipik değerler 50 olay veya 30 saniyedir.
HTTPS REST, remote logging için en yaygın protokoldür. SDK, logları JSON'a serileştirir ve sunucu uç noktasına POST istekleriyle gönderir. gRPC, ikili serileştirme (Protocol Buffers) ile bir alternatiftir, JSON'dan %30–40 daha derli topludur ve kararsız bağlantılara sahip mobil cihazlarda daha hızlıdır. WebSocket, hata ayıklamada gerçek zamanlı loglama için kullanılır ancak güç tüketimi nedeniyle üretimde nadiren kullanılır.
Firebase Crashlytics, çökme raporlarını ve özel logları toplamak için Google'ın ücretsiz hizmetidir. Firebase SDK'ya entegre edilmiştir ve ayrı bir sunucu gerektirmez. Crashlytics, çökme anında otomatik olarak yığın izlerini, cihaz durumunu, işletim sistemi sürümünü ve açık ekranları toplar.
Crashlytics'teki özel loglar log() yöntemiyle eklenir — sunucuya hemen gönderilmez, dairesel bir arabellekte saklanır ve bir sonraki çökme raporuna eklenir. Bu, her logun ayrı bir olay olduğu Sentry'den temel farktır. Crashlytics'teki özel logların maksimum hacmi çökme başına 64 KB'dir.
// Firebase Crashlytics — Android'te özel 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, çökmeleri belirli kullanıcılara bağlamak için setUserIdentifier'ı destekler. Bu, hatanın yaygın mı yoksa yalnızca bir kullanıcıyı mı etkilediğini belirlemeye yardımcı olur. setCustomKey, her rapora rastgele anahtarlar (A/B test sürümü, bölge, fiyatlandırma planı) ekler.
Sentry, yalnızca çökme raporlarını değil, tüm özel etkinlikleri (breadcrumbs) bağımsız kayıtlar olarak depolayan bir hata izleme platformudur. Crashlytics'in aksine Sentry, hatadan önceki olay dizisini kronolojik sırayla görüntülemenizi sağlar — breadcrumbs, çökme günlüğünden yeniden oluşturmaya gerek kalmadan arayüzde görünür.
Sentry SDK, sistem etkinlikleri için otomatik olarak breadcrumbs toplar: UIViewController yaşam döngüsü değişiklikleri (viewDidLoad, viewWillAppear), dokunmalar, düğme basmaları, URLSession aracılığıyla HTTP istekleri. Tüm bu etkinlikler, özel breadcrumbs ile birlikte hata zaman çizelgesinde görünür. Android için, Activity ve Fragment yaşam döngüsü, onClick etkinlikleri ve OkHttp aracılığıyla ağ istekleri benzer şekilde toplanır.
iOS ve Android için Sentry SDK, UI etkinliklerinin (dokunma, gezinme, yaşam döngüsü) breadcrumbs'larını otomatik olarak toplar. Geliştiriciler, tür, kategori ve seviye belirterek addBreadcrumb() aracılığıyla özel breadcrumbs ekleyebilir. Sentry, distributed tracing'i destekler: günlükçü, istemci tarafı breadcrumbs'ları bir izleme kimliği aracılığıyla arka uç istekleriyle ilişkilendirir.
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) aracılığıyla erişilebilen Android'in standart loglama sistemidir. Logcat, tüm sistem ve uygulama mesajlarını seviyelere (V, D, I, W, E, F) ve etiketlere göre düzenleyerek toplar. Logcat'e uzaktan erişim, USB veya Wi-Fi üzerinden ADB ile çalışır, ancak yalnızca hata ayıklama modundaki cihazlar için geçerlidir — USB bağlantısı olmayan cihazlardaki üretim uygulamalarına erişilemez.
Android'de üretimde uzaktan loglama için alternatifler kullanılır: Logcat kendi başına bir sunucuya log gönderemez. Rolü yerel teşhistir. Ancak, tanıdık Log.d / Log.e API'sini korurken mesajları Firebase veya Sentry'ye yönlendiren sarmalayıcılar (Timber, LogcatLive) mevcuttur. Timber, uygulama kodunu değiştirmeden işleyicileri değiştirmeyi sağlar — bir hata ayıklama ağacı Logcat'e yazar, bir sürüm ağacı toplu gönderme ve sıkıştırma ile sunucuya gönderir.
Toplu gönderme (Batching), trafik ve pilden tasarruf etmek için birden çok logu tek bir HTTP isteğinde gruplamaktır. 50 ayrı POST isteği yerine SDK, tek bir JSON dizisi gönderir. Tipik stratejiler: zamanlanmış gönderme (her 30 saniyede bir), sayıya göre (her 50 olayda bir) veya olaya göre (yalnızca kritik hatalarda).
Milyonlarca kullanıcısı olan uygulamalar için log hacmi günde terabaytlara ulaşabilir. Toplu gönderme, istek sayısını 10–50 kat azaltır ve sunucu yükünü düşürür. Sentry, taşıma düzeyinde gzip sıkıştırması kullanarak veri hacmini ek olarak %60–70 oranında azaltır.
// Android'te basit toplu gönderme uygulaması
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, logların HTTP iletimi için standart sıkıştırma yöntemidir. Sentry ve Crashlytics SDK'ları, göndermeden önce istek gövdesini otomatik olarak sıkıştırır. Yinelenen kaldırma — istemci tarafında yinelenen mesajların kaldırılması: aynı olay saniyede 100 kez meydana gelirse, SDK onu count = 100 alanıyla bir kez gönderir.
En yaygın hata, hassas verilerin günlüğe kaydedilmesidir. Remote logging SDK'ları sunucuya veri iletir ve bir geliştirici yanlışlıkla bir parola, belirteç veya kullanıcı e-postasını günlüğe kaydederse, bu veriler bulut altyapısında sonlanır. SDK düzeyinde her zaman PII (Kişisel Olarak Tanımlanabilir Bilgi) filtrelemesi kullanın: Sentry, göndermeden önce verileri temizlemek için yerleşik bir beforeSend kancasına sahiptir.
İkinci yaygın sorun aşırı loglamadır. Her parmak hareketi sunucuya gönderilirse, veri hacmi katlanarak artar ve sunucu maliyetleri de artar. Bir loglama bütçesi belirleyin: üretimde kullanıcı başına dakikada 1–5 olaydan fazla olmamalıdır. Hata ayıklama loglarını yalnızca belirli cihazlar için etkinleştirilen bir işaretle gönderin.
Üçüncü hata, çevrimdışı senaryoyu göz ardı etmektir. SDK, ağ olmadığında logları kaybeder ve yeniden bağlanırken geri yüklemezse, remote logging, kararsız bağlantıları olan kullanıcılar için işe yaramaz. Tüm SDK'lar (Firebase, Sentry) otomatik olarak logları yerel bir dosyada önbelleğe alır ve ağ kullanılabilir olduğunda gönderir, ancak bu ayarın kontrol edilmesi gerekir.
Sıkça Sorulan Sorular
Crash reporting yalnızca uygulama çökmeleri hakkında bilgi toplar. Remote Logging tüm olayları toplar: özel loglar, breadcrumbs, performans metrikleri, UI etkinlikleri. Crash reporting, remote logging'in bir alt kümesidir, alternatifi değildir.
Crashlytics ücretsizdir ve temel çökme raporları için yeterlidir. Breadcrumbs, distributed tracing, özel panolar ve esnek uyarılar gerekiyorsa Sentry daha iyidir. Uyumluluk gereksinimleri olan kurumsal projeler için Sentry, kendi kendine barındırılan sürümde mevcuttur.
Loglama seviyeleri kullanın: debug/info loglarını yalnızca isDebuggable işaretiyle geliştirici cihazından gönderin. beforeSend kancası aracılığıyla diğer seviyeleri (warn, error) filtreleyin, PII içeren alanları kaldırın. Oturum başına maksimum log boyutunu tanımlayın.
Logcat, bir sunucuya uzaktan göndermeyi desteklemez. Android'de remote logging için Firebase veya Sentry'ye yönlendirmek üzere Timber kullanın ve Logcat'i USB ile hata ayıklama için bırakın. Timber, Android Log API'sini değiştirir ve eklenebilir ağaçlar ekler.
Cihaz başına dakikada 50 olaya kadar, toplu gönderme (tek tek değil gruplar halinde gönderme) kullanılırsa pil tüketimini belirgin şekilde etkilemez. Dakikada 200+ olayda Wi-Fi/modem sürekli aktif olacaktır — pil %15–25 daha hızlı biter.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun