La librería log4j es la librería sucesora de log4j y logback para emitir las trazas de depuración e información indispensables cuando son requeridas en una aplicación Java. Suele usarse en combinación slf4j ya que esta permite cambiar de librería de logging subyacente sin hacer ningún cambio en la aplicación.
Algunas de las nuevas características de log4j2 son:
- Rendimiento mejorado usando funcionalidades asíncronas en los loggers.
- Soporte para múltiples APIs como SL4J, Commongs Logging y java.util.logging (JUL).
- Sin encadenamientos a la librería al poder en cualquier momento usar cualquier librería compatible con SLF4J.
- Recarga automática de la configuración sin perder ninguna traza.
- Filtrado avanzado basado en datos de contexto, marcadores, expresiones regulares y otros componentes.
- Arquitectura basada en plugins.
- Soporte de propiedades definidas en archivos de configuración, propiedades del sistema, variables de entorno, el mapa ThreadContext y datos del evento.
- Soporte de lambdas de Java 8. Las expresiones lambdas no se evalúan si no está activado el nivel de log consiguiendo el mismo efecto que con una sentencia if pero en menos código.
- Niveles de log personalizados fácilmente definibles sin necesidad de realizar subclases.
- Recolección de basura reducida lo que evita presión al recolector de basura y mejora el rendimiento de las aplicaciones.
Por defecto, la configuración de log4j se describe en un archivo xml aunque también soporta definirlo en un formato menos verboso como yaml. La siguiente aplicación de Spring Boot al iniciarse emite en la consola varios mensajes usando log4j2.
Usando la clase LogManager se obtiene una referencia a la clase Logger con la que se emiten las trazas y que posee diferentes métodos para cada nivel de traza.
Una vez se ha iniciado la aplicación Spring Boot invoca el método run y se emiten las trazas propias de la aplicación después de las que también Spring Boot y otras librerías emiten., en este caso usando texto en forma de arte ascii.
En el archivo de construcción de la aplicación usando Gradle hay que incluir las dependencias de las librerías.
Las trazas son muy importantes por la valiosa información que proporcionan de lo que está sucediendo en una aplicación a los que recurriendo es posible obtener la valiosa información que permite saber que ha sucedido en una determinada acción o que permite descubrir mucho más rápidamente la causa de un error.
En otro artículo ya he comentado como usar marcadores con sl4j y logback para relacionar trazas que son emitidas en diferentes clases o módulos de la aplicación, también se puede hacer con log4j. En siguientes artículos comentaré como transformar un objeto a un mensaje sin necesidad de convertir ese objeto a un String en cada traza de la aplicación donde se use su información y otra forma de relacionar trazas muy útil en aplicaciones web asignando un indenticador única en cada petición y emitiendolo en todas sus trazas, esto permite saber todo lo que ha ocurrido en una petición entre las muchas que se ejecutan concurrentemente por todos los usuarios de la aplicación.
El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run
.