SLF4J的错误汇总

SLF4J警告或错误消息及其含义

原文:https://www.slf4j.org/codes.html#StaticLoggerBinder


No SLF4J providers were found.

如果在类路径中找不到SLF4J提供程序,则会报告此警告,即不是错误消息。在类路径中放置slf4j-nop.jar slf4j-simple.jar,slf4j-log4j12.jar, slf4j-jdk14.jar或logback-classic.jar中的一个(并且只有一个)应该可以解决问题。请注意,这些提供者必须以slf4j-api 1.8或更高版本为目标。
在没有提供商的情况下,SLF4J将默认为无操作(NOP)记录器提供商。
请注意,slf4j-api版本1.8.x和更高版本使用ServiceLoader 机制。早期版本依赖于slf4j-api不再支持的静态绑定器机制。 请阅读常见问题解答条目SLF4J 1.8.0版有哪些变化?了解更多重要细节。
如果您负责打包应用程序并且不关心日志记录,那么将slf4j-nop.jar放在应用程序的类路径中将摆脱此警告消息。请注意,嵌入式组件(如库或框架)不应声明对任何SLF4J提供程序的依赖关系,但仅依赖于slf4j-api。当一个库声明对SLF4J提供者的编译时依赖性时,它会将该提供者强加给最终用户,从而否定SLF4J的目的。


Class path contains SLF4J bindings targeting slf4j-api versions prior to 1.8

规划Jigsaw(Java 9)的出现,slf4j-api 1.8.x及更高版本使用ServiceLoader 机制。早期版本的SLF4J依赖于slf4j-api不再支持的静态绑定器机制。
如果SLF4J发现没有定位到SLF4J 1.8的提供者,而是发现定位到SLF4J 1.7或更早版本的绑定,它将列出它找到的绑定,否则将忽略它们。
另请参见常见问题解答条目SLF4J 1.8.0版有哪些变化?了解更多重要细节。


IllegalStateException: org.slf4j.LoggerFactory in failed state. Original exception was thrown EARLIER.

这IllegalStateException是在初始化后引发的,并通知用户初始化 LoggerFactory失败。
注意意识到导致失败的异常在较早的阶段被引发是很重要的 。这个早期的例外应该提供关于问题根源的更多有价值的信息。


The method o.a.commons.logging.impl.SLF4FLogFactory#release was invoked.

鉴于commons-logging API的结构,特别是SLF4J所实现的,o.a.commons.logging.impl.SLF4FLogFactory#release() 不应该调用该 方法。但是,根据servlet容器中commons-logging.jar文件的部署情况,release()方法可能会被commons-logging.jar的org.apache.commons.logging.LogFactory类运输副本意外调用 。
对于最新版本的Tomcat来说,这种情况比较常见,特别是如果将jcl-over-slf4j.jar放置在 Web应用程序的WEB-INF / lib目录中而不是 TOMCATHOME/common/lib T O M C A T H O M E / c o m m o n / l i b , 其 中 TOMCAT_HOME代表安装Tomcat的目录。为了充分受益于jcl-over-slf4j.jar提供的稳定性,我们建议您将jcl-over-slf4j.jar放置在 $ TOMCAT_HOME / common / lib中,而不要在Web应用程序中放置副本。
另请参阅错误#22。


Operation [suchAndSuch] is not supported in jcl-over-slf4j.

一个UnsupportedOperationException无论何时被调用的JCL 1.1引入了受保护的方法之一被抛出。这些方法由commons-logging.jar的LogFactory 实现 调用。但是, 由jcl-over-slf4j.jar实现的SLF4FLogFactory不会调用任何这些方法。 LogFactory
如果你观察到这个问题,那么很有可能你的class path中有一个commons-logging.jar的副本,覆盖了使用 jcl-over-slf4j.jar发布的类。请注意,这个问题在性质上非常类似于在前面的项目中讨论的“oacommons.logging.impl.SLF4FLogFactory.release()”方法被调用时发出的警告。


Detected logger name mismatch

仅当slf4j.detectLoggerNameMismatch系统属性设置为true时才会打印记录器名称不匹配警告 。默认情况下,该属性未设置,即使记录器名称不匹配也不会打印警告。
自1.7.9如果通过作为LoggerFactory.getLogger(Class)方法参数传递的类指定的记录器名称与SLF4J内部计算的调用方名称不同,将会打印该警告 。
例如,下面的代码片段

package com.acme;
import com.foo.Kangaroo;

class Fruit {
  Logger logger = LoggerFactory.getLogger(Kangaroo.class);
}

会导致警告

SLF4J: Detected logger name mismatch. Given name: "com.foo.Kangaroo"; computed name: "com.acme.Fruit".

但只有在slf4j.detectLoggerNameMismatch系统属性设置为true的情况下。
对于记录器定义的类是作为参数传递的类参数的超类型的特例,不会发出警告。例如,

class A { 
    Logger logger = LoggerFactory.getLogger(getClass()); 
}
class B extends A { 
    // no mismatch warning will be issued when B is instantiated 
    // given that class A is a super-type of class B
}

如果遇到不能解释的不匹配警告,那么您可能发现了一头白色的大象,这是非常罕见的情况,SLF4J无法正确计算定义记录器的类的名称。我们非常有兴趣了解这种情况。如果当你发现一个莫名其妙的不匹配时,请与我们一起提交一份错误报告。


Failed to load class org.slf4j.impl.StaticLoggerBinder

当org.slf4j.impl.StaticLoggerBinder无法将类加载到内存中时,会报告此警告消息 。如果在类路径上找不到合适的SLF4J绑定,就会发生这种情况。在类路径中放置slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar,slf4j-jdk14.jar或 logback-classic.jar中的一个(并且只有一个)应该可以解决问题。
自1.6.0起SLF4J版本1.6 以来,在没有绑定的情况下,SLF4J将默认为无操作(NOP)记录器实现。
如果您负责打包应用程序并且不关心日志记录,那么将slf4j-nop.jar放在应用程序的类路径中将摆脱此警告消息。请注意,嵌入式组件(如库或框架)不应声明对任何SLF4J绑定的依赖关系,但仅依赖于slf4j-api。当库声明对SLF4J绑定的编译时依赖性时,它会将该绑定强加给最终用户,从而否定SLF4J的目的。


Multiple bindings were found on the class path

SLF4J API被设计为一次绑定一个底层日志框架。如果类路径中存在多个绑定,则SLF4J将发出警告,列出这些绑定的位置。
当在类路径中有多个绑定可用时,请选择一个且只有一个您希望使用的绑定,并删除其他绑定。例如,如果您在类路径中同时具有 slf4j-simple-1.8.0-beta2.jar和 slf4j-nop-1.8.0-beta2.jar,并且您希望使用nop(无操作)绑定,请删除 slf4j-simple-1.8.0-beta2.jar从类路径。
SLF4J在此警告中提供的位置列表通常会提供足够的信息来识别依赖性,从而将不需要的SLF4J绑定过渡到您的项目中。在您的项目的pom.xml文件中,在声明不良依赖时请排除此SLF4J绑定。例如, cassandra-all版本0.8.1将log4j 和slf4j-log4j12声明为编译时依赖性。因此,如果在项目中包含cassandra-all作为依赖项,则cassandra-all声明将导致 slf4j-log4j12.jar和log4j.jar作为依赖关系被引入。如果您不希望将log4j用作SLF4J后端,则可以指示Maven排除这两个工件,如下所示:

<dependencies>
  <dependency>
    <groupId> org.apache.cassandra</groupId>
    <artifactId>cassandra-all</artifactId>
    <version>0.8.1</version>

    <exclusions>
      <exclusion> 
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
      </exclusion>
      <exclusion> 
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
      </exclusion>
    </exclusions> 

  </dependency>
</dependencies>

注意 SLF4J发出的警告就是这个警告。即使存在多个绑定,SLF4J也会选择一个日志框架/实现并绑定它。SLF4J选择绑定的方式由JVM确定,并且对于所有实际目的应视为随机。从版本1.6.6开始,SLF4J将命名它实际绑定的框架/实现类。
诸如库或框架之类的嵌入式组件不应声明对任何SLF4J绑定的依赖关系,但仅依赖于slf4j-api。当库声明对SLF4J绑定的编译时依赖性时,它会将该绑定强加给最终用户,从而否定SLF4J的目的。当您遇到嵌入式组件,声明对任何SLF4J绑定的编译时间依赖性时,请花时间联系该组件/库的作者,并请他们修补它们的方式。


slf4j-api version does not match that of the binding

SLF4J绑定指定了一个工件,如 slf4j-jdk14.jar或slf4j-log4j12.jar,用于 将 slf4j 绑定到基础日志框架,如java.util.logging和log4j。
混合混合不同版本的slf4j-api.jar和SLF4J绑定可能会导致问题。例如,如果您使用slf4j-api-1.8.0-beta2.jar,那么您还应该使用slf4j-simple-1.8.0-beta2.jar,使用slf4j-simple-1.5.5.jar将不起作用。
注意从客户端的角度来看,所有版本的slf4j-api都是兼容的。使用slf4j-api-N.jar编译的客户端代码将与slf4j-api-M.jar一起运行,适用于任何N和M.您只需确保绑定的版本与slf4j-api.jar的版本匹配。您不必担心项目中给定依赖项使用的slf4j-api.jar版本。你总是可以使用任何版本的slf4j-api.jar,只要slf4j-api.jar的版本和它的绑定匹配,你应该没问题。
在初始化时,如果SLF4J怀疑可能存在api与绑定版本不匹配问题,它会发出关于可疑不匹配的警告。


Logging factory implementation cannot be null

当LoggerFactory 类无法找到合适的绑定时,会报告此错误。在类路径中放置slf4j-nop.jar,slf4j-simple.jar, slf4j-log4j12.jar,slf4j-jdk14.jar或 logback-classic.jar中的一个(并且只有一个)应该证明是有效的补救措施。


Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError.

slf4j-log4j12模块的目的是将对SLF4J记录器的调用委托或重定向到log4j。log4j-over-slf4j模块的目的是将对log4j记录器的调用重定向到SLF4J。如果SLF4J与slf4j-log4j12.jar绑定, 并且类路径中还存在log4j-over-slf4j.jar,则StackOverflowError在第一次调用SLF4J或log4j记录器后不可避免地会出现a。
以下是例外情况的样子:

Exception in thread "main" java.lang.StackOverflowError
  at java.util.Hashtable.containsKey(Hashtable.java:306)
  at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:36)
  at org.apache.log4j.LogManager.getLogger(LogManager.java:39)
  at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)
  at org.apache.log4j.Category.<init>(Category.java:53)
  at org.apache.log4j.Logger..<init>(Logger.java:35)
  at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:39)
  at org.apache.log4j.LogManager.getLogger(LogManager.java:39)
  at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)
  at org.apache.log4j.Category..<init>(Category.java:53)
  at org.apache.log4j.Logger..<init>(Logger.java:35)
  at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:39)
  at org.apache.log4j.LogManager.getLogger(LogManager.java:39)
  subsequent lines omitted...

从1.5.11开始, SLF4J软件通过抛出一个异常来详细说明问题的实际原因,从而抢占了不可避免的堆栈溢出错误。这被认为比留下用户想知道的原因更好 StackOverflowError。
有关此主题的更多背景信息,请参阅桥接旧版API。


Detected both jcl-over-slf4j.jar AND slf4j-jcl.jar on the class path, preempting StackOverflowError.

slf4j-jcl模块的目的是将对SLF4J记录器的调用委托或重定向到jakarta公共日志记录(JCL)。jcl-over-slf4j模块的用途是将对JCL记录器的调用重定向到SLF4J。如果SLF4J与slf4j-jcl.jar绑定, 并且jcl-over-slf4j.jar也存在于类路径中,那么StackOverflowError 在第一次调用SLF4J或JCL记录器后不可避免地会发生a。
以下是例外情况的样子:

Exception in thread "main" java.lang.StackOverflowError
  at java.lang.String.hashCode(String.java:1482)
  at java.util.HashMap.get(HashMap.java:300)
  at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:67)
  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)
  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
  at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:289)
  at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:69)
  at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:249)
  at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
  subsequent lines omitted...

从1.5.11开始, SLF4J软件通过抛出一个异常来详细说明问题的实际原因,从而抢占了不可避免的堆栈溢出错误。这被认为比留下用户想知道的原因更好 StackOverflowError。
有关此主题的更多背景信息,请参阅桥接旧版API。


Failed to load class “org.slf4j.impl.StaticMDCBinder”

此错误表示在类路径上找不到合适的SLF4J绑定。在类路径中放置slf4j-nop.jar,slf4j-simple.jar, slf4j-log4j12.jar,slf4j-jdk14.jar或 logback-classic.jar中的一个(并且只有一个) 应该可以解决问题。


MDCAdapter cannot be null

当org.slf4j.MDC类尚未正确初始化时,会报告此错误。与之前列出的项目相同的原因和补救措施。


A number (N) of logging calls during the initialization phase have been intercepted and are now being replayed. These are subject to the filtering rules of the underlying logging system.

自1.7.15起始阶段记录呼叫记录并在初始化后重播。请注意,重播的日志记录调用将受到基础日志记录系统的过滤。
原则上,重放只发生在第一次日志记录调用发生时已经是多线程的应用程序。
另请参阅替代记录器。


Substitute loggers were created during the default configuration phase of the underlying logging system

高度可配置的日志系统(如logback和log4j)可以创建在其初始化期间调用记录器的组件。有关 典型事件,请参阅问题 LOGBACK-127。但是,由于与SLF4J的绑定过程尚未完成(因为基础日志记录系统尚未完全加载到内存中),因此不可能对这种记录器创建请求进行处理。
为了避免这种鸡与鸡的问题,SLF4J在这个阶段创建替代记录器(初始化)。在这个阶段对替代记录器的调用只是被放弃。初始化完成后,替代记录器会将日志记录调用委托给适当的记录器实现,否则将作为任何其他记录器返回的函数 LoggerFactory。
如果必须创建任何替代记录器,SLF4J将发布这样的记录器列表。此列表旨在让您知道在初始化过程中对这些记录器进行的任何记录调用已被删除。
另请参阅拦截和重播的日志记录调用。


SLF4J versions 1.4.0 and later requires log4j 1.2.12 or later

跟踪级别已添加到2005年8月29日发布的1.2.12版的log4j中。跟踪级已于2007年5月16日添加到版本1.4.0中的SLF4J API。因此,从SLF4J 1.4.0开始,log4j绑定SLF4J需要log4j 1.2.12或更高版本。
但是,正如问题59中所报告的,在某些环境中,升级log4j版本可能会很困难。为了适应这种情况,SLF4J Log4jLoggerAdapter将把TRACE级别映射为DEBUG。


java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent

Logback-经典版本1.1.4和更高版本需要slf4j-api版本1.7.15或更高版本。
使用类路径中早期的slf4j-api.jar,尝试对由Logback版本1.1.4或更高版本返回的Logger实例进行自省会导致NoClassDefFoundError 类似于下面显示的情况。

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
        at java.lang.Class.privateGetPublicMethods(Class.java:2571)
        at java.lang.Class.getMethods(Class.java:1429)
        at java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1261)
        at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1122)
        at java.beans.Introspector.getBeanInfo(Introspector.java:414)
        at java.beans.Introspector.getBeanInfo(Introspector.java:161)

在类路径中放置slf4j-api.jar版本1.7.15或更高版本应该可以解决问题。
请注意,此问题仅在logback版本为1.1.4及更高版本时发生,其他绑定(如slf4j-log4j,slf4j-jdk14和slf4j-simple)不受影响。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值