viernes, 1 de abril de 2011

Más allá del println

Si queréis llevar vuestra depuración de código a otro nivel, sin tener que recurrir continuamente al System.out.println, podéis utilizar una librería de manejo de trazas.

Estas librerías os permiten manejar trazas de ejecución de los programas que hagáis, evitando mostrar siempre los mensajes por la consola, y además definen distintos niveles de mensajes para poder elegir con qué detalle se quiere almacenar la traza.

El propio Java viene con un manejador de trazas (Logger), no obstante el más utilizado es Log4J y es el que os voy a presentar a continuación.

Para utilizar Log4J en un proyecto, lo primero que hay que hacer es incluir en dicho proyecto el jar con las librerías de Log4J que os podéis descargar de la página del proyecto.

El funcionamiento básico es definirse un objeto de tipo Logger llamando a su constructor y pasándole como parámetro el nombre que le queramos dar (si en vez de un nombre le pasamos una clase, utilizará el nombre de la clase).

Logger miLogger = Logger.getLogger("programa.logger"); 

Después tenemos que configurar cómo queremos manejar la traza. Esto se puede hacer o utilizando un fichero de configuración o desde el mismo código. Lo más recomendable es utilizar un fichero de configuración; no obstante, para este ejemplo utilizaremos el configurador por defecto que nos muestra las trazas de todos los niveles por la consola.

BasicConfigurator.configure();  

A partir de aquí, podremos utilizar distintos métodos para almacenar nuevas trazas con distintos niveles. Log4J tiene los siguientes niveles de traza (definidos como constantes de la clase org.apache.log4j.Level):

  • FATAL. Errores serios que harán que la aplicación interrumpa su ejecución 
  • ERROR. Errores con los que la aplicación podría continuar su ejecución 
  • WARN. Situaciones potenciales de error 
  • INFO. Mensajes generales de diagnóstico del progreso de la aplicación 
  • DEBUG. Mensajes específicos de diagnóstico del progreso de la aplicación 
  • TRACE. Mensajes mucho más específicos sobre la aplicación

Y cada uno de dichos niveles tiene un método que almacena una traza en dicho nivel.

public void debug(Object message) 

Si quisiéramos mostrar sólo a partir de cierto nivel, se podría también indicar tanto en el código como en el fichero de configuración. Por ejemplo la siguiente linea mostraría sólo las trazas de nivel INFO y superiores (WARN, ERROR y FATAL).

logger.setLevel(Level.INFO);

Si ejecutamos el siguiente ejemplo

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

public class ClaseEjecutable {

 public static void main(String[] args) {
  Logger miLogger = Logger.getLogger("programa.logger");

     BasicConfigurator.configure();

  miLogger.info("Inicio de la ejecución");

  String cadena = "Cadena de texto";
  int numero = 1;

  cadena = cadena + numero;

  if (cadena.equals("Cadena de texto1")){
   System.out.println("La cadena calculada es: " + cadena);
   miLogger.debug("La concatenación ha funcionado");
  } else {
   miLogger.debug("La concatenación no ha funcionado");
  }


  miLogger.info("Fin de la ejecución");
 }

}

podremos ver por la consola la siguiente salida donde se muestran las distintas trazas y sus correspondientes niveles.

0 [main] INFO programa.logger - Inicio de la ejecución 
La cadena calculada es: Cadena de texto1 
1 [main] DEBUG programa.logger - La concatenación ha funcionado 
1 [main] INFO programa.logger - Fin de la ejecución  

Una vez hemos acabado de depurar el programa, no hace falta que eliminemos ni una linea de código, con poner el nivel ERROR ya solo nos aparecerán aquellas trazas que muestren errores en el programa.

Log4J permite hacer muchas más cosas que las que se mencionan aquí, con lo que os animo echar un vistazo a su documentación y a los tutoriales disponibles en la Web.

¿Qué os parece esta alternativa al println?
¿Creéis que la usaréis en un futuro cercano?

2 comentarios:

  1. Hola,

    no soy alumno suyo, sólo quería darle las gracias por escribir este blog. Es útil para los que estamos en segundo año, imagino que deberá serlo aún más para los que están en primero.

    Se agradece que los profesores hagan estas cosas "de puertas afuera".

    Y sobre el artículo, no había oído hablar nunca del manejo de trazas. Es muy interesante, a ver si me acuerdo de probarlo la próxima vez que me toque darle a Java.

    Un saludo.

    ResponderEliminar
  2. Hola,

    Me alegro de que te haya sido útil. Anímate a usar trazas en tu próximo programa. :)

    ResponderEliminar