miércoles, 30 de noviembre de 2011

Ejemplo logback

El otro día os hablaba de las bondades de logback. Como ya os dije, SFL4J es una capa de abstracción para nuestros sistemas de logging (similar a JCL) que liga una implementación concreta en el momento de la compilación. Logback es una implementación concreta de SFL4J, pero podemos utilizar SFL4J con diversas librerías de logging como log4j o java.util.logging.

En el siguiente gráfico vemos un dibujo sacado de la documentación oficial de SFL4J en el que se muestran varios escenarios de uso de SLF4J:

Escenarios de uso de SLF4J

En la gráfica podemos varios escenarios:


  • En el primer escenario (SLF4J unbound) no se liga ninguna implementación de SLF4J, por lo que no se escribe log. Sólo tendremos el jar slf4j-api.jar.
  • En el segundo escenario (SLF4J bound to logback-classic) ligamos logback a SLF4J. Esto lo explicaremos más adelante en nuestro ejemplo.
  • En el tercer escenario (SLF4J bound to log4j) ligamos log4j a SLF4J. Migrar de una aplicación en la que tenemos log4j y JCL es sencillo. Se puede hacer manualmente o mediante SLF4J Migrator.  En ambos casos las librerías se deben incorporar a mano en nuestra aplicación y son slf4j-api.jar y slf4j-log412.jar. La librería log4j también debería estar en nuestro classpath.
  • En el cuarto escenario (SLF4J bound to java.util.logging) ligamos java.util.logging a SLF4J. Para ellos utilizamos el jar slf4j-jdk14.jar y el sistema de logging que contiene la JVM
  • El sexto escenario se utiliza cuando queremos que una aplicación que escribe log no lo escriba. Se liga a una implementación que no escribe log (o lo envia a /dev/null). Para ello como siempre necesitamos el jar slf4j-api.jar y como binding el slf4j-nop.jar.

Me he puesto manos a la obra y he utilizado logback en una aplicación que se expone como servicio web. A continuación vemos los pasos más importantes. El proyecto lo he realizado con Eclipse 3.3 y el plugin WST instalado:

  • Creamos una aplicación web con Eclipse. En dicha aplicación una clase Java (en el paquete es.jpascu) será la implementación de un servicio web con Axis 1.4. Ver mi post anterior de creación de servicios web con Axis en Eclipse. 
  • En la implementación del servicio web y en las clases donde queramos que se escriba log importamos estas dos clases:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

  • Después nos definimos un Logger en cada una de ellas:

final Logger logger = LoggerFactory.getLogger(MiWs.class);


  • Luego escribimos varias sentencias de log por el código con varios niveles de log como log.debug("Mensaje"), log.info("Mensaje") y log.error("Mensaje")... Eso a nuestra elección...
  • Después incluimos las librerías de SLF4J (slf4j-api-1.5.11.jar) y logback (logback-classic-1.0.0.jar y logback-core-1.0.0.jar) como veíamos en el escenario 2 de la imagen de arriba:
Librerías de aplicación web con WS Axis y logback
  • Un tema importante es el caso de librerías de terceros que utilizan otro sistema de log, como ejemplo Axis 1.4 que utiliza JCL junto con log4j. Para utilizar este tipo de librerías (por eso he hecho el servicio web, para utilizar Axis) debemos incluir una librería que nos haga de puente para este tipo de aplicaciones y eliminar el commons-logging de nuestro classpath si estuviese. En nuestro caso, el jar puente es jcl-over-slf4j-1.5.11.jar (último escenario de la imagen de arriba).
  • Por último, nos quedaría añadir a nuestro classpath el fichero de configuración de logback. El fichero puede ser lo complejo que queramos y podemos añadir muchas características de logback (jmxConfigurator, MDC, nuevos appenders...). Si queréis podéis consultar la documentación de SLF4J. Yo os pongo un fichero sencillito que configura un file appender con un filtro de mensajes de nivel INFO, 300 días de historia y 5 líneas en los mensajes de trazas. Vosotros podéis ir añadiendo lo que queráis para probar las diferentes características de logback:



 
 
  
   INFO
  
  
   rutaDirectorioLog/aplicacion.log
  

  
  
   
    %date %-5level %logger{20} - %message%n %exception{5}
   
  

  
   
    /opt/bea/weblogic92/aplicaciones/logs/internacionalGBC/internacionalGBC.log.%d{yyyy-MM-dd}.log
   
   
   30
  
 


 
  
   
    %date{HH:mm:ss.SSS} %-5level %logger{10} - %message%n
   
  
 


Espero haber ayudado a integrar logback en vuestras aplicaciones.

Salu2.

1 comentario:

  1. Gracias por el post.
    Y viva Murcia que tierra mas bonika!!!!

    ResponderEliminar