Hacemos un pequeño alto en el camino en el Curso de Programación Android para hablar de un tema que, si bien no es específico de Android, sí nos va a resultar bastante útil a la hora de explorar otras características de la plataforma.
Una de las técnicas más útiles a la hora de depurar y/o realizar el seguimiento de aplicaciones sobre cualquier plataforma es la creación de logs de ejecución. Android por supuesto no se queda atrás y nos proporciona también su propio servicio y API de logging a través de la clase android.util.Log.
En Android, todos los mensajes de log llevarán asociada la siguiente información:
- Fecha/Hora del mensaje.
- Criticidad. Nivel de gravedad del mensaje (se detalla más adelante).
- PID. Código interno del proceso que ha introducido el mensaje.
- Tag. Etiqueta identificativa del mensaje (se detalla más adelante).
- Mensaje. El texto completo del mensaje.
De forma similar a como ocurre con otros frameworks de logging, en Android los mensajes de log se van a clasificar por su criticidad, existiendo así varias categorias (ordenadas de mayor a menor criticidad):
- Error
- Warning
- Info
- Debug
- Verbose
Para cada uno de estos tipos de mensaje existe un método estático independiente que permite añadirlo al log de la aplicación. Así, para cada una de las categorías anteriores tenemos disponibles los métodos e(), w(), i(), d() y v() respectivamente.
Cada uno de estos métodos recibe como parámetros la etiqueta (tag) y el texto en sí del mensaje. Como etiqueta de los mensajes, aunque es un campo al que podemos pasar cualquier valor, suele utilizarse el nombre de la aplicación o de la actividad concreta que genera el mensaje. Esto nos permitirá más tarde crear filtros personalizados para identificar y poder visualizar únicamente los mensajes de log que nos interesan, entre todos los generados por Android [que son muchos] durante la ejecución de la aplicación.
Hagamos un miniprograma de ejemplo para ver cómo fuenciona esto. El programa será tan simple como añadir varios mensajes de log dentro del mismo onCreate de la actividad principal y ver qué ocurre. Os muestro el código completo:
public class LogsAndroid extends Activity { private static final String LOGTAG = "LogsAndroid"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.e(LOGTAG, "Mensaje de error"); Log.w(LOGTAG, "Mensaje de warning"); Log.i(LOGTAG, "Mensaje de información"); Log.d(LOGTAG, "Mensaje de depuración"); Log.v(LOGTAG, "Mensaje de verbose"); } }
Si ejecutamos la aplicación anterior en el emulador veremos cómo se abre la pantalla principal que crea Eclipse por defecto y aparentemente no ocurre nada más. ¿Dónde podemos ver los mensajes que hemos añadido al log? Pues para ver los mensajes de log nos tenemos que ir a la perspectiva de Eclipse llamada DDMS. Una vez en esta perspectiva, podemos acceder a los mensajes de log en la parte inferior de la pantalla, en una vista llamada LogCat. En esta ventana se muestran todos los mensajes de log que genera Android durante la ejecución de la aplicación, que son muchos, pero si buscamos un poco en la lista encontraremos los generados por nuestra aplicación, tal como se muestra en la siguiente imagen (click para ampliar):
Como 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 distinto según su criticidad.
En este caso de ejemplo, los mensajes mostrados son pocos y fáciles de localizar en el log, pero para una aplicación real, el número de estos mensajes puede ser mucho mayor y aparecer intercalados caóticamente entre los demás mensajes de Android. Para estos casos, la ventada de LogCat ofrece una serie de funcionalidades para facilitar la visualización y búsqueda de determinados mensajes.
Por ejemplo, podemos restringir la lista para que sólo muestre mensajes con una determinada criticidad mínima. Esto se consigue pulsando alguno de los 5 primeros botones que se observan en la parte superior derecha de la ventana de log. Así, si por ejemplo pulsamos sobre el botón de la categoría Info (en verde), en la lista sólo se mostrarán los mensajes con criticidad Error, Warning e Info.
Otro método de filtrado más interesante es la definición de filtros personalizados (botón «+» verde), donde podemos filtrar la lista para mostrar únicamente los mensajes con un PID o Tag determinado. Si hemos utilizado como etiqueta de los mensajes el nombre de nuestra aplicación o de nuestras actividades esto nos proporcionará una forma sencilla de visualizar sólo los mensajes generados por nuestra aplicación.
Así, para nuestro ejemplo, podríamos crear un filtro indicando como Tag la cadena «LogsAndroid», tal como se muestra en la siguiente imagen:
Esto creará una nueva ventana de log con el nombre que hayamos especificado en el filtro, donde sólo aparecerán nuestros 5 mensajes de log de ejemplo (click para ampliar):
Por último, cabe mencionar que existe una variante de cada uno de los métodos de la clase Log que recibe un parámetro más en el que podemos pasar un objeto de tipo excepción. Con esto conseguimos que, además del mensaje de log indicado, se muestre también la traza de error generada con la excepción.
Veamos esto con un ejemplo, y para ello vamos a forzar un error de división por cero, vamos a capturar la excepción y vamos a generar un mensaje de log con la variante indicada:
try { int a = 1/0; } catch(Exception ex) { Log.e(LOGTAG, "División por cero!", ex); }
Si volvemos a ejecutar la aplicación y vemos el log generado, podermos comprobar cómo se muestra la traza de error corespondiente generada con la excepción (click para ampliar).
En definitiva, podemos comprobar como la generación de mensajes de log puede ser una herramienta sencilla pero muy efectiva a la hora de depurar aplicaciones que no se ajustan mucho a la depuración paso a paso, o simplemente para generar trazas de ejecución de nuestras aplicaciones para comprobar de una forma sencilla cómo se comportan.
Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la página del curso en GitHub.
Curso de Programación Android en PDF
¿Te ha sido de utilidad el Curso de Programación Android? ¿Quieres colaborar de forma económica con el proyecto? Puedes contribuir con cualquier cantidad, unos céntimos, unos euros, cualquier aportación será bienvenida. Además, si tu aportación es superior a una pequeña cantidad simbólica recibirás como agradecimiento un documento con la última versión del curso disponible en formato PDF. Sea como sea, muchas gracias por colaborar!
Más información:
10 comentarios
[…] Depuración en Android: Logging [Nuevo!] […]
muy buen curso Muchas Gracias Felicitaciones
Saludos, Es de admirar todo el trabajo que ud ha hecho, muy bueno y muchas gracias por compartir ese conocimiento. Exitos. GBY
Sencillo, claro y conciso, muy buen aporte.
Saludos
Excelente artículo
hola , me gusta mucho tu blog.
con respecto a Log te quería hacer una pregunta. ¿cuando instala la aplicación en un móvil se puede consultar el Log y donde?
Saludos
Saludos. primero quiero agradecerte por compartir todo este conocimiento, ya que me ha sido de mucha ayuda.
ahora bien tengo una consulta la cual es la siguiente:
como capturar el evento de forzar cierre y manejar la excepción? o como puedo consultar el log de una aplicación que ya este instalada en el dispositivo. ya que algunas veces mi aplicación da forzar cierre y no logro descifrar la razón.
De antemano muchas gracias!
Me fue de gran utilidad. No se puede explicar mejor…
Eternamente agradecido!
En verdad muchas muchas gracias. Son extremadamente utiles sus tutoriales.
Saludos
[…] Depuración en Android: Logging [v3] […]