SLF4J - Mensagens de erro
Neste capítulo, discutiremos as várias mensagens de erro ou avisos que recebemos ao trabalhar com SLF4J e as causas / significados dessas mensagens.
Falha ao carregar a classe "org.slf4j.impl.StaticLoggerBinder".
Este é um aviso que é causado quando não há ligações SLF4J fornecidas no classpath.
A seguir está o aviso completo -
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 isso, você precisa adicionar qualquer uma das ligações da estrutura de registro. Isso é explicado noHello world capítulo deste tutorial.
Note - Isso ocorre em versões do SLF4J que estão entre 1.6.0 e 1.8.0-beta2.
Nenhum provedor SLF4J foi encontrado
Em slf4j-1.8.0-beta2, o aviso acima é mais claro dizendo “No SLF4J providers were found”.
A seguir está o aviso completo -
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 contém ligações SLF4J direcionadas a versões slf4j-api anteriores a 1.8
Se você estiver usando a versão SLF4J 1.8 e tiver as ligações das versões anteriores no caminho de classe, mas não as ligações da 1.8, você verá um aviso conforme mostrado abaixo.
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
Se você está trabalhando com slf4j-jcl e se você tiver apenas slf4j-jcl.jar em seu classpath, você obterá uma exceção como a fornecida abaixo.
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 isso, você precisa adicionar commons-logging.jar ao seu classpath.
O jcl-over-slf4j.jar foi detectado E o slf4j-jcl.jar vinculado ao classpath.
A ligação slf4j-jcl.jar redireciona chamadas do logger slf4j para JCL e o jcl-over-slf4j.jarredireciona as chamadas do logger JCL para slf4j. Portanto, você não pode ter ambos no caminho de classe do seu projeto. Se você fizer isso, obterá uma exceção como a fornecida abaixo.
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 isso, exclua qualquer um dos arquivos jar.
Detectada incompatibilidade de nome do logger
Você pode criar um objeto Logger por -
Passando o nome do logger a ser criado como um argumento para o getLogger() método.
Passar uma classe como argumento para este método.
Se você está tentando criar o objeto de fábrica do logger passando uma classe como um argumento, e se você configurou a propriedade do sistema slf4j.detectLoggerNameMismatch como verdadeiro, então o nome da classe que você passa como um argumento para o getLogger() método e a classe que você usa devem ser os mesmos, caso contrário, você receberá o seguinte aviso -
“Incompatibilidade de nome de logger detectada.
Considere o seguinte exemplo.
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");
}
}
Aqui, definimos a propriedade slf4j.detectLoggerNameMismatch como true. O nome da classe que usamos éSLF4JExample e o nome da classe que passamos para o método getLogger () é Sample uma vez que ambos não são iguais, receberemos o seguinte aviso.
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 - Isso ocorre após slf4j 1.7.9
Classpath contém várias ligações SLF4J.
Você deve ter apenas uma ligação no caminho de classe. Se você tiver mais de uma ligação, receberá um aviso listando as ligações e a localização delas.
Por supor, se temos as ligações slf4j-jdk14.jar e slf4j-nop.jar no classpath obteremos o seguinte aviso.
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]
Foram detectados log4j-over-slf4j.jar E slf4j-log4j12.jar vinculados no caminho da classe
Para redirecionar as chamadas do registrador log4j para slf4j, você precisa usar log4j-over-slf4j.jar ligação e se você quiser redirecionar chamadas slf4j para log4j, você precisa usar slf4j-log4j12.jar obrigatório.
Portanto, você não pode ter ambos no caminho de classe. Se o fizer, obterá a seguinte exceção.
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.