SLF4J - Mensajes de error

En este capítulo, analizaremos los diversos mensajes de error o advertencia que recibimos al trabajar con SLF4J y las causas / significados de esos mensajes.

No se pudo cargar la clase "org.slf4j.impl.StaticLoggerBinder".

Esta es una advertencia que se produce cuando no se proporcionan enlaces SLF4J en la ruta de clases.

A continuación se muestra la advertencia completa:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.

Para resolver esto, debe agregar cualquiera de los enlaces del marco de registro. Esto se explica en elHello world capítulo de este tutorial.

Note - Esto ocurre en versiones de SLF4J que están entre 1.6.0 y 1.8.0-beta2.

No se encontraron proveedores de SLF4J

En slf4j-1.8.0-beta2, la advertencia anterior es más clara diciendo “No SLF4J providers were found”.

A continuación se muestra la advertencia completa:

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

Classpath contiene enlaces SLF4J dirigidos a versiones slf4j-api anteriores a 1.8

Si está utilizando la versión 1.8 de SLF4J y tiene los enlaces de versiones anteriores en la ruta de clases pero no los enlaces de 1.8, verá una advertencia como se muestra a continuación.

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions prior to
1.8.
SLF4J: Ignoring binding found at
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#ignoredBindings for an explanation.

NoClassDefFoundError: org / apache / commons / logging / LogFactory

Si esta trabajando con slf4j-jcl y si tu solo tienes slf4j-jcl.jar en su classpath, obtendrá una excepción como la que se indica a continuación.

Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/commons/logging/LogFactory
   at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:77)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.ClassNotFoundException:
org.apache.commons.logging.LogFactory
   at java.net.URLClassLoader.findClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   ... 3 more

Para resolver esto, debe agregar commons-logging.jar a tu classpath.

Se detectó jcl-over-slf4j.jar Y enlazado slf4j-jcl.jar en la ruta de clase

La Unión slf4j-jcl.jar redirige las llamadas del registrador slf4j a JCL y el jcl-over-slf4j.jarredirige las llamadas del registrador JCL a slf4j. Por lo tanto, no puede tener ambos en la ruta de clases de su proyecto. Si lo hace, obtendrá una excepción como la que se indica a continuación.

SLF4J: Detected both jcl-over-slf4j.jar AND bound slf4j-jcl.jar on the class
path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#jclDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
   at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:71)
   at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:42)
   at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
   at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
   at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both jcl-over-slf4j.jar
AND bound slf4j-jcl.jar on the class path, preempting StackOverflowError. See
also http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
   at org.slf4j.impl.JCLLoggerFactory.<clinit>(JCLLoggerFactory.java:54)
   ... 7 more

Para resolver esto, elimine cualquiera de los archivos jar.

No coincide el nombre del registrador detectado

Puede crear un objeto Logger por:

  • Pasando el nombre del registrador a crear como argumento al getLogger() método.

  • Pasando una clase como argumento a este método.

Si está intentando crear el objeto de fábrica del registrador pasando una clase como argumento, y si ha establecido la propiedad del sistema slf4j.detectLoggerNameMismatch a verdadero, entonces el nombre de la clase que pasa como argumento a la getLogger() El método y la clase que use deben ser los mismos; de lo contrario, recibirá la siguiente advertencia:

“Se detectó una falta de coincidencia en el nombre del registrador.

Considere el siguiente ejemplo.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
   public static void main(String[] args) {
      System.setProperty("slf4j.detectLoggerNameMismatch", "true");
      
      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(Sample.class);

      //Logging the information
      logger.info("Hi Welcome to Tutorilspoint");
   }
}

Aquí, hemos establecido la propiedad slf4j.detectLoggerNameMismatch en true. El nombre de la clase que usamos esSLF4JExample y el nombre de clase que hemos pasado al método getLogger () es Sample dado que ambos no son iguales, recibiremos la siguiente advertencia.

SLF4J: Detected logger name mismatch. Given name: "Sample"; computed name:
"SLF4JExample".
SLF4J: See http://www.slf4j.org/codes.html#loggerNameMismatch for an
explanation
Dec 10, 2018 12:43:00 PM SLF4JExample main
INFO: Hi Welcome to Tutorilspoint

Note - Esto ocurre después de slf4j 1.7.9

Classpath contiene múltiples enlaces SLF4J.

Debería tener solo un enlace en la ruta de clases. Si tiene más de un enlace, recibirá una advertencia que enumera los enlaces y la ubicación de los mismos.

Supongamos que si tenemos los enlaces slf4j-jdk14.jar y slf4j-nop.jar en el classpath obtendremos la siguiente advertencia.

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-nop-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an
explanation.
SLF4J: Actual binding is of type [org.slf4j.helpers.NOPLoggerFactory]

Detectado log4j-over-slf4j.jar Y vinculado slf4j-log4j12.jar en la ruta de clases

Para redirigir las llamadas del registrador log4j a slf4j, debe usar log4j-over-slf4j.jar vinculante y si desea redirigir las llamadas slf4j a log4j, debe usar slf4j-log4j12.jar Unión.

Por lo tanto, no puede tener ambos en la ruta de clases. Si lo hace, obtendrá la siguiente excepción.

SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the
class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
   at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
   at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
   at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
   at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
   at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar
AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.