Logs con Logcat con Android Studio | Jetpack Compose

Video thumbnail

Si eres nuevo desarrollando para Android con Kotlin, seguramente en algún lugar del código de tu aplicación has usado:

println(message)

Donde message es algún mensaje para imprimir por la consola. Aunque esto funciona para depuraciones rápidas, a menudo no aparece en el Logcat de Android Studio o se pierde entre otros mensajes del sistema. La API de Android incorpora la clase Log para gestionar los mensajes de tu aplicación de forma estructurada, y por lo tanto es lo que debemos usar al momento de desarrollar.

¿Qué es el Logcat?

El Logcat es la herramienta de Android Studio donde podemos ver todos los mensajes del sistema y de nuestra aplicación en tiempo real. Si no la tienes visible, puedes habilitarla en las pestañas inferiores de tu entorno de desarrollo.

Por defecto, el Logcat es muy "verboso" (muestra demasiada información). Si reinicias la aplicación, verás que aparecen cientos de comandos ejecutándose rápidamente. Para que esta herramienta sea útil, debemos aprender a enviar nuestros propios mensajes y filtrarlos.

Y ya vimos el primer ejemplo de log con el Composable de Snackbar en Android Studio.

️ Estructura de un Log: Clave y Valor

Para enviar un mensaje al Logcat, utilizamos una estructura de Clave (Tag) y Valor (Mensaje). Por ejemplo:

Tag: Es una etiqueta (como "myApp") que nos servirá para filtrar los mensajes más adelante.

Mensaje: Es el texto descriptivo de lo que está ocurriendo en la app.

Niveles de Prioridad

Dependiendo de la importancia de lo que queramos registrar, podemos clasificar los mensajes en diferentes niveles:

  • Log.v (Verbose): Información detallada y masiva.
  • Log.d (Debug): Mensajes para nosotros durante el desarrollo (muy común).
  • Log.i (Info): Mensajes informativos generales.
  • Log.w (Warning): Advertencias sobre posibles problemas.
  • Log.e (Error): Errores críticos. Se muestran en color rojo.
  • Log.wtf (What a Terrible Failure): Casos excepcionales que nunca deberían ocurrir.

En aplicaciones pequeñas, casi siempre basta con usar Log.d para nuestras pruebas y Log.e cuando algo falla (por ejemplo, si una integración con PayPal da problemas).
 

MetodoConstanteDescripsión
Log.e()ERROREste nivel de log debe usarse cuando algo fatal ocurre en la aplicación; en otras palabras, al ocurrir algún error o issies, normalmente es buena idea usar este nivel para reportarlos.
Log.w()WARNINGEste nivel debe usarse cuando ocurre algún cambio serio o inesperado; pero es probable que sea un estado recuperable.
Log.i()INFOEste nivel debe usarse al tratarse de un acontecimiento netamente informativo y que no necesariamente sea un error.
Log.d()DEBUGEste nivel debe usarse cuando se desee conseguir una mayor información; algo relevante que esta ocurriendo cuando la aplicación está ejecutándose en el dispositivo.

Información de los métodos de la Clase Log

En Android, todos los mensajes de log llevarán asociada la siguiente información:

  • Fecha: Hora del mensaje log.
  • Criticidad: Nivel del mensaje log.
  • PID.
  • Tag: Etiqueta identificativa del mensaje log.
  • Mensaje: Texto del mensaje log.

Parámetros de los métodos de la Clase Log

Cualquiera de los métodos explicados recibe 2 parámetros como mínimo, el tag y el mensaje:

  • (String) tag: Usado para identificar el origen del mensaje. Es una buena práctica declararlo como una constante en tu clase o fichero. En Kotlin, puedes hacerlo así:

    private const val TAG = "MyScreenTag"

    Una práctica común es usar el nombre de la clase como etiqueta para identificar fácilmente el origen del log.

  • (String) msg: El mensaje que se desea registrar.
  • (Throwable) tr: La excepción que se desea registrar (opcional).

Para ver cualquiera de estos mensajes es necesario tener la ventana de Logcat habilitada en Android Studio. La puedes encontrar en:

View >> Tool Windows >> Logcat

Ejemplos con Kotlin y Jetpack Compose

Veamos un ejemplo práctico en una pantalla creada con Jetpack Compose:

import android.util.Log
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect

private const val TAG = "MyComposableScreen"

@Composable
fun MyScreen() {
    // LaunchedEffect se usa para ejecutar el bloque solo una vez cuando el composable entra en la composición
    LaunchedEffect(Unit) {
        Log.e(TAG, "Mensaje de error")
        Log.w(TAG, "Mensaje de warning")
        Log.i(TAG, "Mensaje de información")
        Log.d(TAG, "Mensaje de depuración")
    }
    
    // Resto de la UI de tu pantalla
}

Como podemos ver, imprimimos todos los métodos de la Clase Log ya explicados; al observar la consola Logcat en Android Studio veremos algo como esto (la apariencia puede variar ligeramente con las versiones de Android Studio):

log messages android

Cómo se puede observar, para cada mensaje se muestra toda la información que indicamos al principio del artículo, además de estar diferenciados por un color.

Existe una variante para cada uno de los métodos de la Clase Log ya explicados, consiste en agregar un parámetro extra del tipo Throwable:

import android.util.Log
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect

private const val TAG = "MyComposableScreen"

@Composable
fun MyErrorScreen() {
    LaunchedEffect(Unit) {
        try {
            val a = 1 / 0
        } catch (t: Throwable) {
            Log.e(TAG, "Mensaje de error", t)
            Log.w(TAG, "Mensaje de warning", t)
            Log.i(TAG, "Mensaje de información", t)
            Log.d(TAG, "Mensaje de depuración", t)
        }
    }
}

Aunque la forma correcta sería solo utilizar el método Log.e() para registrar excepciones:

import android.util.Log
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect

private const val TAG = "MyComposableScreen"

@Composable
fun MyCorrectErrorScreen() {
    LaunchedEffect(Unit) {
        try {
            val a = 1 / 0
        } catch (t: Throwable) {
            Log.e(TAG, "Ocurrió un error al dividir", t)
        }
    }
}

Si ejecutamos el código anterior, observaremos que se ha agregado la excepción a nuestra traza en Logcat:

log error android

Filtrado en el Logcat

Una de las mayores ventajas del Logcat es el buscador. Si escribes tu etiqueta (ej. myApp) en la barra de búsqueda, la herramienta ocultará todo el "ruido" del sistema y te mostrará únicamente tus mensajes.

También puedes seleccionar en qué dispositivo quieres monitorear los logs si tienes varios emuladores o teléfonos conectados simultáneamente.

¡Y eso es todo! Con esta herramienta ya podemos probar funciones asíncronas de manera visual y entender exactamente qué está pasando bajo el capó de nuestra aplicación.

Logcat

Conclusiones

Utilizar estos Log provistos por la API de Android, se traducen como una herramienta sencilla pero muy valiosa la hora de depurar, registrar errores o trazas de ejecución informativas de nuestras aplicaciones.

El siguiente Composable que vamos a ver, es el de los Bottom Sheets en Android Studio.

Acepto recibir anuncios de interes sobre este Blog.

Aprende a usar Snackbar en Jetpack Compose, qué es el Scaffold, manejo de estado, corrutinas y cómo mostrar mensajes temporales en Android moderno.

| 👤 Andrés Cruz

🇺🇸 In english