SLF4J, Simple Logging Facade For Java, es una abstración de un sistema de logging para una aplicación Java. Con esto queremos decir que no es un sistema de log completo, sino que simplemente nos sirve como «fachada» para hablar con otros sistemas de log. Por ejemplo, java.util.logging, log4j o logback.
Por qué necesitamos SLF4J
¿Y para qué necesitamos esta librería fachada?. De hecho, aparentemente complica más el asunto, porque necesitaríamos tres librerías de logger: La de SLF4J, la del logger concreto que queramos usar y un adaptador entre ambas.
Imagina que no estás haciendo una aplicación Java completa, sino sólo una librería o un módulo que quieres luego reaprovechar en otras aplicaciones. O incluso que quieres publicar para que usen otras personas.
Si en ese módulo usas tu logger favorito como podría ser logback o log4j, la aplicación completa que use este módulo estaría obligada a usar el mismo sistema de logger, o bien a tratar y configurar dos, el de tu módulo y el que se quiera usar la aplicación principal.
Esto, desde luego, puede no ser lo deseado en el primer caso y sería un engorro en lo segundo. La solución ideal es que el módulo no «obligue» a la aplicación a usar un sistema de log concreto. Y por eso SLF4J es útil en estos casos.
Cómo usar SLF4J
En tu librería añades la dependencia slf4j-api y la usas como un sistema de log normal. La aplicación que quiera usar tu librería es libre de decidir que sistema de log quiera usar. Por ejemplo, si quiere usar log4j, simplemente tendría que añadir la dependencia de log4j-core y un adaptador entre este y slf4j, que sería la librería log4j-slf4j-impl. Todo el log de tu libreria con slf4j-api será redirigido a log4j-core.
En el caso de logback, tienes logback-classic, que ya tiene incluido el adaptador. Por ello, bastaría sólo con esta dependencia.
Si en tu librería tienes test de JUnit o pequeños main de prueba, no tendrás sistema de log. SLF4J no funciona solo, necesita que le pongas un sistema de log concreto y el adaptador. Así que para estos test de JUnit o programas de prueba, necesitas añadir la dependencia de test tanto del sistema de log concreto como del adaptador.
Para facilitar esta tarea, slf4j proporciona su propio sistema de log simple, llamado slf4j-simple. Bastaría que lo añadas como dependencia de test si no quieres complicarte la vida con otros log más completos. En cualquier caso, para este propósito de test, logback-classic también es sencillo de usar puesto que lleva el adaptador incluido y por defecto no necesita ningún fichero de configuración.
Qué problemas podemos encontrar con SLF4J
Cuando hacemos nuestra librería, a nivel de uso, no deberiamos encontrar ninguno. Como mucho, que alguna funcionalidad muy específica de algún sistema de log concreto no esté accesible desde SLF4J, pero serían casos muy raros y concretos. Tampoco creo que sea algo muy recomendado que una librería que pretendes que sea útil en varios proeyectos use cosas muy concretas de un sistema de log muy concreto.
Sin emabargo, cuando alguien haba una aplicación usando nuestra libería, puede encontrar algún problema.
Failed to load class «org.slf4j.impl.StaticLoggerBinder». Es encesario que en la aplicación tengamos una librería adaptador. Si no se pone en las dependencias, aparecerá este error indicando que no la encuentra. Es lo que puede pasar también en nuestros test de JUnit de la libería si no ponemos como dependencia de test el log y el adaptador.
Class path contains multiple SLF4J bindings. Este error sale en caso de que se pongan dependencias de varios adaptadores, por el motivo que sea. Se deben revisar dependencias y dejar sólo uno. Realmente el error es un Warning. slf4j elegirá cualquiera de los adaptadores. Y ya conoces a Murphy, elegirá el que no queríamos que cogiera.
Este error, si no es por un despiste nuestro, puede dar guerra. Por desgracia, hay librerías y frameworks muy extendidos que no usan SLF4J, sino que de alguna forma usan su propio sistema de log. O que usan SLF4J pero vienen además con el sistema de log y el adaptador que ellas han decidido. Por ejemplo, apache storm-core viene con slf4j, log4j y su adaptador. Si necesitas usar storm-core dentro de tu aplicación y no quieres usar log4j, tienes un problema.
Problemas de versiones. Puesto que hay tres librerías implicadas: slf4j, el log concreto y el adaptador, es importante asegurarse que las versiones son compatibles entre sí. La mejor forma es buscar el adaptador en mvnrepository y ver sus dependencias. Por ejemplo, si miras el adaptador log4j-slf4j-impl, versión 2.22.0, verás que usa log4j versión 2.22.0 y slf4j-api versión 2.0.9. No suele haber problemas con pequeñas diferencias de versión, pero asegúrate que no sean versiones muy distintas o de revisarlo en caso de que el log te haga «cosas raras».