Remote Logging es un mecanismo para enviar registros desde un dispositivo móvil a un servidor remoto para su análisis y monitoreo centralizado. A diferencia del registro local, que almacena datos en el dispositivo, la recopilación remota permite ver errores y anomalías de todos los dispositivos de usuarios en tiempo real. Según Sentry Resource Library, las aplicaciones con remote logging encuentran el 92% de los errores de producción durante la primera hora después del lanzamiento, frente al 15% cuando solo se utilizan informes de fallos. Esta es una herramienta obligatoria para cualquier equipo de desarrollo móvil: Firebase Crashlytics, Sentry y Datadog proporcionan SDK listos para iOS y Android.
Puntos clave
Remote Logging es el proceso de recopilar registros de dispositivos remotos y transmitirlos a un servidor central para su análisis. En el contexto del desarrollo móvil, remote logging incluye no solo informes de fallos, sino también eventos personalizados, breadcrumbs, métricas de rendimiento y escenarios de usuario.
La principal diferencia entre remote logging y crash reporting es la proactividad. Crash reporting solo recopila datos sobre fallos de la aplicación que ya ocurrieron. Remote logging recopila la secuencia de eventos antes del fallo: qué pantallas abrió el usuario, qué solicitudes hizo, qué datos ingresó. Esto permite reproducir el escenario del error sin comunicarse con el usuario.
Apple proporciona un mecanismo integrado de recopilación remota de registros mediante .logarchive, pero para aplicaciones de producción casi siempre se utilizan servicios de terceros. El SDK de Android incluye Logcat, accesible de forma remota mediante ADB, pero no para dispositivos de usuarios finales sin modo de depuración.
La arquitectura de remote logging consta de tres componentes: el SDK cliente en el dispositivo que recopila y almacena en búfer los registros, el protocolo de transporte para enviar datos y el servidor para almacenamiento y visualización.
| Componente | Función | Ejemplos |
|---|---|---|
| SDK cliente | Recopilación, almacenamiento en búfer, batching | Firebase SDK, Sentry Cocoa, Timber |
| Transporte | Transmisión de datos mediante HTTPS | REST, gRPC, WebSocket |
| Servidor | Almacenamiento, indexación, alertas | Sentry, Crashlytics, Datadog |
El SDK cliente almacena en búfer los registros en RAM y los envía periódicamente al servidor por lotes. Si el dispositivo está fuera de línea, los registros se guardan en un archivo local y se envían en la siguiente conexión de red. El tamaño del búfer y el intervalo de envío son configurables: los valores típicos son 50 eventos o 30 segundos.
HTTPS REST es el protocolo más común para remote logging. El SDK serializa los registros a JSON y los envía mediante solicitudes POST al endpoint del servidor. gRPC es una alternativa con serialización binaria (Protocol Buffers), que es 30–40% más compacta que JSON y más rápida en dispositivos móviles con conexiones inestables. WebSocket se utiliza para el registro en tiempo real en depuración, pero rara vez en producción debido al consumo de energía.
Firebase Crashlytics es un servicio gratuito de Google para recopilar informes de fallos y registros personalizados. Está integrado en Firebase SDK y no requiere un servidor separado. Crashlytics recopila automáticamente stack traces, estado del dispositivo, versión del SO y pantallas abiertas en el momento del fallo.
Los registros personalizados en Crashlytics se añaden mediante el método log() — no se envían al servidor inmediatamente, sino que se almacenan en un búfer circular y se adjuntan al siguiente informe de fallo. Esta es una diferencia clave con Sentry, donde cada registro es un evento separado. El volumen máximo de registros personalizados en Crashlytics es de 64 KB por fallo.
// Firebase Crashlytics — registros personalizados en 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 admite setUserIdentifier para vincular fallos con usuarios específicos. Esto ayuda a determinar si un error es masivo o afecta solo a un usuario. setCustomKey añade claves arbitrarias a cada informe — versión de prueba A/B, región, plan tarifario.
Sentry es una plataforma de monitoreo de errores que almacena no solo informes de fallos, sino también todos los eventos personalizados (breadcrumbs) como registros independientes. A diferencia de Crashlytics, Sentry permite ver la secuencia de eventos antes del error en orden cronológico — los breadcrumbs son visibles en la interfaz sin necesidad de reconstruirlos a partir del registro del fallo.
El SDK de Sentry recopila automáticamente breadcrumbs para eventos del sistema: cambios de ciclo de vida de UIViewController (viewDidLoad, viewWillAppear), toques, pulsaciones de botones, solicitudes HTTP mediante URLSession. Todos estos eventos aparecen en la línea de tiempo del error junto con los breadcrumbs personalizados. Para Android, se recopilan de manera similar el ciclo de vida de Activity y Fragment, eventos onClick y solicitudes de red mediante OkHttp.
El SDK de Sentry para iOS y Android recopila automáticamente breadcrumbs de eventos de UI: toques, navegación, ciclo de vida. Los desarrolladores pueden añadir breadcrumbs personalizados mediante addBreadcrumb() especificando el tipo, categoría y nivel. Sentry admite distributed tracing: el registrador vincula los breadcrumbs del lado del cliente con las solicitudes del backend mediante un ID de trace.
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 es el sistema de registro estándar de Android, accesible mediante Android Debug Bridge (ADB). Logcat recopila todos los mensajes del sistema y de las aplicaciones, organizados por niveles (V, D, I, W, E, F) y etiquetas. El acceso remoto a Logcat funciona mediante ADB por USB o Wi-Fi, pero solo para dispositivos en modo de depuración — las aplicaciones de producción en dispositivos sin conexión USB no son accesibles.
Para el registro remoto en producción en Android se utilizan alternativas: Logcat por sí mismo no puede enviar registros a un servidor. Su función es el diagnóstico local. Sin embargo, existen envoltorios (Timber, LogcatLive) que reenvían mensajes a Firebase o Sentry manteniendo la API familiar Log.d / Log.e. Timber permite cambiar los manejadores sin modificar el código de la aplicación — un árbol de depuración escribe en Logcat, un árbol de release envía al servidor con batching y compresión.
Batching es la agrupación de múltiples registros en una sola solicitud HTTP para ahorrar tráfico y batería. En lugar de 50 solicitudes POST individuales, el SDK envía un único array JSON. Las estrategias típicas son: envío programado (cada 30 segundos), por cantidad (cada 50 eventos) o por evento (solo en errores críticos).
Para aplicaciones con millones de usuarios, el volumen de registros puede alcanzar terabytes por día. El batching reduce la cantidad de solicitudes en 10–50 veces y disminuye la carga del servidor. Sentry utiliza compresión gzip a nivel de transporte, lo que reduce adicionalmente el volumen de datos en un 60–70%.
// Implementación simple de batching en 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 es el método de compresión estándar para la transmisión HTTP de registros. Los SDK de Sentry y Crashlytics comprimen automáticamente el cuerpo de la solicitud antes de enviarlo. Deduplicación — eliminación de mensajes duplicados en el lado del cliente: si el mismo evento ocurre 100 veces por segundo, el SDK lo envía una vez con el campo count = 100.
El error más común es el registro de datos sensibles. Los SDK de remote logging transmiten datos al servidor, y si un desarrollador registra accidentalmente una contraseña, token o correo electrónico del usuario, estos datos terminan en la infraestructura en la nube. Utilice siempre filtrado de PII (Información de Identificación Personal) a nivel de SDK: Sentry tiene un gancho beforeSend integrado para limpiar los datos antes de enviarlos.
El segundo problema común es el registro excesivo. Si cada movimiento del dedo se envía al servidor, el volumen de datos crece exponencialmente, al igual que los costes del servidor. Defina un presupuesto de registro: no más de 1–5 eventos por usuario por minuto en producción. Envíe registros de depuración solo con una bandera que se active para dispositivos específicos.
El tercer error es ignorar el escenario sin conexión. Si el SDK pierde los registros cuando no hay red y no los restaura al reconectarse, el remote logging es inútil para usuarios con conexiones inestables. Todos los SDK (Firebase, Sentry) almacenan automáticamente en caché los registros en un archivo local y los envían cuando la red está disponible, pero esta configuración debe verificarse.
Preguntas frecuentes
Crash reporting solo recopila información sobre fallos de la aplicación. Remote Logging recopila todos los eventos: registros personalizados, breadcrumbs, métricas de rendimiento, eventos de UI. Crash reporting es un subconjunto de remote logging, no una alternativa.
Crashlytics es gratuito y suficiente para informes de fallos básicos. Sentry es mejor si necesita breadcrumbs, distributed tracing, paneles personalizados y alertas flexibles. Para proyectos empresariales con requisitos de cumplimiento, Sentry está disponible en versión self-hosted.
Utilice niveles de registro: envíe registros debug/info solo desde el dispositivo del desarrollador mediante la bandera isDebuggable. Filtre los otros niveles (warn, error) a través de un gancho beforeSend, eliminando los campos que contengan PII. Defina el tamaño máximo de registro por sesión.
Logcat no admite el envío remoto a un servidor. Para remote logging en Android, utilice Timber para reenviar a Firebase o Sentry, y deje Logcat para la depuración mediante USB. Timber reemplaza la API Log de Android y añade árboles plantables.
Hasta 50 eventos por minuto por dispositivo no afectan notablemente el consumo de batería si se utiliza batching (envío por lotes, no uno por uno). Con 200+ eventos por minuto, el Wi-Fi/módem estará constantemente activo — la batería se agota 15–25% más rápido.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también