Ir al contenido principal

SFL4J y JCL. Estandares de logging

Desde que comenzamos con el desarrollo de aplicaciones siempre hemos tenido la premisa de evitar las sentencias System.out para depurar nuestro código. Es una buena práctica insertar en el código de nuestras aplicaciones las sentencias apropiadas de log para depurar correctamente los fallos que se puedan producir. En determinadas ocasiones lo ideal será tener un sistema de log que persista los mensajes de logs de nuestras aplicaciones en una base de datos y se comunique con nuestras aplicaciones mediante colas JMS, pero esto es algo más complejo que trataremos en una futura ocasión.

Todos o casi todos los que  hemos desarrollado aplicaciones Java hemos utilizado JCL (Java Commons Logging), una capa de abstracción que permite conectar varias implementaciones como log4j o commons loggings. La implementación de log4j se ha convertido en un estandar de facto para realizar el log de nuestras aplicaciones. 


JCL permite cambiar la API que vamos a utilizar de forma dinámica en tiempo de ejecución. Esto puede provocar algún que otro problema con los classloaders. Además de este hay otros problemas que seguro que habréis sufrido en vuestros desarrollos como la necesidad de algún appender determinado que no teníamos (alguna vez he tenido que implementar algún appender que rotase por día y por tamaño...)

El sucesor natural de JCL es SLF4J. Al igual que el primero, es una capa de abstracción que permite que utilicemos varias implementaciones (logback, log4j) pero a diferencia de JCL la implementación queda ligada cuando desplegamos nuestra aplicación mediante un JAR puente.

Las mejoras principales al utilizar SLF4J son las siguientes:

  • Se acaban los problemas con los classloaders, al ligarse la API de implementación estáticamente y no dinámicamente como en JCL.
  • Trazas con parámetros más sencillas.
  • Independencia, puesto que puedes añadir múltiples vinculaciones añadiendo un nuevo JAR. 

Hoy leo en JavaHispano una noticia sobre logback 1.0, el sucesor de log4j. En el artículo nos muestra un link con las razones de migrar a logback 1.0.  Logback es una implementación de SLF4J creada por el mismo autor que log4j Ceki GülcüA continuación os enumero una lista de buenas razones para pasarse a logback:


  • Cambios en caliente desde JMX. Con la clase JMXConfigurator podemos recargar la configuración de logback desde un fichero por defecto, desde un fichero existente o una URL. Podremos modificar la lista de nuestros loggers y sus niveles de log.

  • Uso de variables en las rutas de ficheros. Ya no tendremos que indicar rutas absolutas para nuestros file appenders.
  • Filtros. Los filtros no parecen en principio algo fundamental, pero en grandes aplicaciones desplegadas en un entorno de producción nos pueden servir de mucho. Imaginemos que tenemos un terminal bancario en producción y que ocasionalmente ocurre un error. Normalmente el nivel de log en este entorno es de INFO o WARN así que detectar los errores es más complicado. Imaginemos que este error no se puede reproducir en el entorno de validación debido a las diferencias existentes entre ambos entornos. Con log4j, para detectar este problema, debemos bajar el nivel de log a DEBUG e intentar analizar los logs para comprobar que sucede, con el correspondiente impacto en el rendimiento de la aplicación. Sin embargo, con  logback podemos crear un filtro para que acepte los logs de DEBUG de un usuario determinado (el encargado de detectar el problema) y siga escribiendo sólo los logs de WARNING o INFO para el resto de usuarios de producción. 
  • RollingFileAppender ha sido mejorado. Muchas veces sólo queríamos mantener los logs de nuestra aplicación durante un año. Ahora configurando nuestro RollingFileAppender con un RollingPolicy podemos indicar mediante la propiedad maxHistory el número de días o meses que queremos mantener nuestros ficheros logs. También nos permite comprimir los ficheros de logs asincronamente para que no afecte al rendimiento con grandes volumenes de datos.
  • Layout mejorados. Permiten limitar el tamaño de la pila de excepciones en los logs. 
  • Lilith es una aplicación GUI para visualizar los logs de logback tipo Apache Chainsaw. Está preparado para manejar grandes volumenes de datos. También hay un plugin de Eclipse que te permite hacerlo.
  • El rendimiento es mucho mayor, basándose en log4j, el código ha sido reescrito para en algunos casos ser 10 veces más rápido. 
  • Batería de pruebas más robusta que en log4j.
  • Posibilidad de configurar logback en XML y también con Groovy.
  • Documentación muy extensa.
  • Una de las características nuevas de logback que más me ha gustado y que más he sufrido con log4j es la escritura segura de varios appenders en el mismo fichero. Mediante la propiedad prudent varias instancias de FileAppender corriendo en varias JVMs (por ejemplo en un entorno de cluster) realizaran una escritura segura del mismo fichero de log. La clase FileAppender y todas sus subclases (RollingFileAppender) se pueden recuperar de errores I/O y pueden seguir funcionando sin reiniciar la aplicación.
  • En los ficheros de configuración podemos emplear condiciones (if-then-else) para realizar pequeños cambios de configuración de logs entre los diferentes entornos que tengamos (desarrollo, test , producción) sin tener que duplicar ficheros. 
  • Las trazas de las excepciones en los ficheros de logs contienen información de los paquetes de las clases. Esto en ocasiones nos puede resultar muy útil porque además de saber qué clases provocan el error, también nos informa de la versión a la qué pertenecen.

Por todas estas razones, creo que deberíamos migrar nuestras aplicaciones a logback. En definitiva, es una versión mejorada de nuestro querido log4j. Podemos utilizar el SFL4JMigrator, herramienta que nos ayuda a migrar nuestras aplicaciones en pocos minutos. Podéis leer un artículo de mi amigo y compañero de batallas el señor Fuente para profundizar más sobre este tema.



Referencias: logback |  balteus

Comentarios

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos. Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches: Sustancia primaria Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Petróleo=Unidad

JAXB: Leer y escribir ficheros XML

Muchas veces en nuestras aplicaciones debemos manejar documentos XML ( Extensible Markup Language ). Este lenguaje se ha convertido en un estándar para intercambio de datos entre programas y aplicaciones a través de Internet. En un esquema XML (o  XSD ) podemos definir los elementos que pueden aparecer en un documento XML así como las relaciones entre los mismos. JAXB ( Java Architecture for XML Binding ) es un estándar Java para transformar un esquema XML (o  XSD ) en una representación a objetos java. Mediante la API de JAXB podemos mapear un objeto Java a un documento XML ( "marshall" ) y el proceso contrario, es decir, a partir de un esquema XML crear su conjunto de objeto Java asociado ( "unmarshall" ). JAXB Resumiendo lo que nos proporciona JAXB es: Generación de objetos Java a partir de un XSD a través de un compilador Proporciona capacidades de marshall/unmarshall (escribir fichero XML desde java y al contrario) Integración con Maven a través de xj

Matemáticas y cine.

El otro día estaba viendo por la televisión una película llamada 21 blackjack . En una escena de la película el profesor de matemáticas ( Kevin Spacey ) le presenta a uno de sus alumnos la siguiente situación: se encuentra en un concurso en la que debe escoger entre tres puertas (1,2 y 3). En dos de ellas hay una cabra, sin embargo en una de las 3 hay un flamante coche nuevo. El alumno responde que quiere abrir la puerta. El presentador, conocedor de lo que hay detrás de cada puerta decide abrir otra puerta diferente mostrando detrás de ella una cabra. El profesor se dirige al alumno y le pregunta, ¿cambiarías la puerta o te quedarías con la puerta que tienes? Muchos de nosotros cambiaríamos de puerta pensando que es una treta del presentador para engañarnos. ¿Cual elegiríais vosotros? Al comienzo tenemos 1/3 de probabilidades de acertar la puerta donde está el coche. Una vez que el presentador abre la puerta con una cabra, la mayoría de gente piensa que hay la misma probabilidad de