Introducción a SLF4J

1. Información general

Fachada de registro simple para Java (abreviado SLF4J): actúa como fachada para diferentes marcos de registro (por ejemplo, java.util.logging, logback, Log4j). Ofrece una API genérica que hace que el registro sea independiente de la implementación real.

Esto permite que coexistan diferentes marcos de registro. También ayuda a migrar de un marco a otro. Finalmente, además de la API estandarizada, también ofrece algo de "azúcar sintáctico".

Este artículo discutirá las dependencias y la configuración necesarias para integrar SLF4J con Log4j2, Logback, Log4J2 y Jakarta Commons Logging. Puede leer más sobre cada una de estas implementaciones en el artículo Introducción al registro de Java.

2. La configuración de Log4j2

Para usar SLF4J con Log4j2, debe agregar las siguientes bibliotecas a pom.xml :

 org.apache.logging.log4j log4j-api 2.7   org.apache.logging.log4j log4j-core 2.7   org.apache.logging.log4j log4j-slf4j-impl 2.7 

La última versión se puede encontrar aquí: log4j-api, log4j-core, log4j-slf4j-impl.

La configuración de registro real se adhiere a la configuración nativa de Log4j 2. Veamos cómo se crea la instancia de Logger :

public class SLF4JExample { private static Logger logger = LoggerFactory.getLogger(SLF4JExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }

Tenga en cuenta que Logger y LoggerFactory pertenecen al paquete org.slf4j . Aquí se encuentra disponible un ejemplo de un proyecto que se ejecuta con la configuración explicada.

3. La configuración de Logback

Para usar SLF4J con Logback, no necesita agregar SLF4J a su classpath. Logback ya está usando SLF4J. Se considera la implementación de referencia. Solo necesitamos incluir la biblioteca Logback:

 ch.qos.logback logback-classic 1.1.7 

La última versión se puede encontrar aquí: logback-classic.

La configuración es específica de Logback pero funciona a la perfección con SLF4J. Con las dependencias y la configuración adecuadas en su lugar, se puede usar el mismo código de las secciones anteriores para manejar el registro.

4 . La configuración de Log4j

En las secciones anteriores, cubrimos un caso de uso en el que SLF4J "se sienta" en la parte superior de la implementación de registro particular. Usado así, abstrae completamente el marco subyacente.

Hay casos en los que una solución de registro existente no se puede reemplazar, por ejemplo, debido a requisitos de terceros. Sin embargo, esto no significa que el proyecto esté “condenado” únicamente al marco ya utilizado.

SLF4J se puede configurar como un puente, donde las llamadas a un marco existente se redirigen a él. Agreguemos las dependencias necesarias para crear un puente para Log4j:

 org.slf4j log4j-over-slf4j 1.7.30 

Con la dependencia en su lugar (verifique lo último en log4j-over-slf4j), todas las llamadas a Log4j serán redirigidas a SLF4J. Considere la documentación oficial para obtener más información sobre cómo crear puentes entre los marcos existentes.

Al igual que con los otros marcos, Log4j puede servir como implementación subyacente. Agreguemos las dependencias necesarias:

 org.slf4j slf4j-log4j12 1.7.30   log4j log4j 1.2.17 

La última versión se puede encontrar aquí para slf4j-log4j12 y log4j. Aquí se encuentra disponible un proyecto ejemplar, configurado de la manera explicada.

5. Configuración del puente JCL

En las secciones anteriores, mostramos cómo se puede usar la misma base de código para admitir el registro usando diferentes implementaciones. Si bien esta es la principal promesa y fortaleza de SLF4J, también es el objetivo detrás de JCL (Jakarta Commons Logging o Apache Commons Logging).

JCL es, por sus intenciones, un marco similar a SLF4J. La principal diferencia es que JCL resuelve la implementación subyacente durante el tiempo de ejecución mediante un sistema de carga de clases. Este enfoque se percibe como problemático en los casos en que hay cargadores de clases personalizados en juego.

SLF4J resuelve sus enlaces en tiempo de compilación. Se percibe más simple pero lo suficientemente poderoso.

Afortunadamente, dos marcos pueden trabajar juntos en el modo puente:

 org.slf4j jcl-over-slf4j 1.7.30 

La última versión de dependencia se puede encontrar aquí jcl-over-slf4j.

Al igual que con los otros casos, la misma base de código se ejecutará bien. Un ejemplo de un proyecto completo que ejecuta esta configuración está disponible aquí.

6. Más bondad de SLF4J

SLF4J proporciona adicionales que pueden hacer que el registro sea más eficiente y el código más legible. Por ejemplo, SLF4J proporciona una interfaz muy útil para trabajar con parámetros:

String variable = "Hello John"; logger.debug("Printing variable value: {}", variable);

Aquí está el ejemplo de código de Log4j que hace lo mismo:

String variable = "Hello John"; logger.debug("Printing variable value: " + variable);

Como puede ver, Log4j concatenará cadenas independientemente del nivel de depuración que esté habilitado o no. En aplicaciones de alta carga, esto puede causar problemas de rendimiento. SLF4J concatenará cadenas solo cuando el nivel de depuración esté habilitado. Para hacer lo mismo con Log4J, debe agregar un bloque adicional if que verificará si el nivel de depuración está habilitado o no:

String variable = "Hello John"; if (logger.isDebugEnabled()) { logger.debug("Printing variable value: " + variable); }

SLF4J estandarizó los niveles de registro que son diferentes para las implementaciones particulares. El nivel de registro FATAL se eliminó (se introdujo en Log4j) basado en la premisa de que en un marco de registro, no deberíamos decidir cuándo se debe terminar una aplicación.

Los niveles de registro utilizados son ERROR, WARN, INFO, DEBUG, TRACE . Puede leer más sobre su uso en el artículo Introducción al registro de Java.

7. Conclusión

SLF4J ayuda con el cambio silencioso entre marcos de registro. Es simple, pero flexible y permite mejorar la legibilidad y el rendimiento.

Como de costumbre, el código se puede encontrar en GitHub. Además, estamos haciendo referencia a otros dos proyectos dedicados a diferentes artículos, pero que contienen configuraciones de registro discutidas, aquí y aquí.