我的应用程序将部署在tcServer和WebSphere 6.1上。这个应用程序使用ehCache,因此需要slf4j作为依赖项。
因此,我将slf4j-api.jar (1.6) jar添加到war文件包中。
应用程序在tcServer中正常工作,除了以下错误:
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.
然而,当我在WebSphere中部署时,我得到了一个java.lang.NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder。
同时伴有加载类“org.slf4j.impl.StaticMDCBinder”失败
我已经检查了两个应用服务器的类路径,没有其他slf4j jar。
有人知道这里会发生什么吗?
我在WebSphere 6.1中也遇到了同样的问题。正如Ceki所指出的,WebSphere正在使用大量的jar,其中一个指向slf4j的旧版本。
No-Op回退只发生在slf4j -1.6+上,因此任何比它更老的东西都会抛出异常并停止部署。
SLf4J站点中有一个文档可以解决这个问题。随后,我在应用程序中添加了slf4j-simple-1.6.1.jar以及我已经拥有的slf4j-api-1.6.1.jar。
如果您使用Maven,请使用${slf4j添加以下依赖项。Version}是slf4j的最新版本
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version}</version>
</dependency>
这解决了我的问题。
当我得到以下错误时,我陷入了这个问题:
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.
当我在我的库中使用slf4j-api-1.7.5.jar。
尽管我尝试了整个建议的补充jar,如slf4j-log4j12-1.7.5.jar, slf4j-simple-1.7.5,但错误消息仍然存在。当我将slf4j-jdk14-1.7.5.jar添加到java库中时,这个问题最终得到了解决。
在http://www.slf4j.org/download.html上获得整个slf4j包
Slf4j是底层日志框架(如log4j、logback、java.util.logging)的门面。
为了连接底层框架,slf4j使用了绑定。
log4j - slf4j-log4j12-1.7.21.jar
java.util.logging – slf4j-jdk14-1.7.21.jar etc
如果没有绑定jar,就会抛出上述错误。您可以下载这个jar并将其添加到类路径中。
对于maven依赖,
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
除了slf4j-log4j12-1.7.21.jar之外,这个依赖项还将slf4j-api-1.7.21.jar以及log4j-1.2.17.jar拉到您的项目中
参考:http://www.slf4j.org/manual.html
有时我们应该看到来自SLF4J警告的说明:请参阅http://www.slf4j.org/codes.html#StaticLoggerBinder以了解更多详细信息。
当在类路径上找不到合适的SLF4J绑定时,就会发生这种情况
您可以搜索此警告产生的原因。
将*slf4j-nop.jar、slf4j-simple.jar、slf4j-log4j12.jar、slf4j-jdk14.jar或logback-classic.jar*中的一个jar添加到类路径中应该可以解决问题。
compile "org.slf4j:slf4j-simple:1.6.1"
例如,将上述代码添加到构建中。Gradle或maven项目的pom.xml的相应代码。
他们的官网给出了解决方案:
Failed to load class org.slf4j.impl.StaticLoggerBinder
This warning message is reported when the
org.slf4j.impl.StaticLoggerBinder class could not be loaded into
memory. This happens when no appropriate SLF4J binding could be found
on the class path. Placing one (and only one) of slf4j-nop.jar
slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or
logback-classic.jar on the class path should solve the problem. SINCE
1.6.0 As of SLF4J version 1.6, in the absence of a binding, SLF4J will default to a no-operation (NOP) logger implementation. If you are
responsible for packaging an application and do not care about
logging, then placing slf4j-nop.jar on the class path of your
application will get rid of this warning message. Note that embedded
components such as libraries or frameworks should not declare a
dependency on any SLF4J binding but only depend on slf4j-api. When a
library declares a compile-time dependency on a SLF4J binding, it
imposes that binding on the end-user, thus negating SLF4J's purpose.
解决方案:我已经添加到我的项目中使用intellij的maven研究,我选择了slf4j-jdk14.jar。
这里有相当多的答案建议向maven pom文件添加slf4j-simple依赖项。您可能需要检查最新的版本。
在https://mvnrepository.com/artifact/org.slf4j/slf4j-simple
您将找到SLF4J简单绑定的最新版本。选择一个最适合你的版本(2021-07年的1.7.32仍然是2021-10年的稳定版本),并将其包含到你的pom.xml中。
为了您的方便,这里显示了一些依赖项-但当您阅读本文时,它们可能不是最新的!
2021-08测试版
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.0-alpha5</version>
</dependency>
2019年2月的测试版
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.8.0-beta4</version>
</dependency>
稳定版2021-07
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
由于下面的评论,我删除了范围测试部分。
正如SLF4J手册所述
Java的简单日志Facade (SLF4J)就是一个简单的Facade
或者对各种日志框架进行抽象,例如
java.util。日志、logback和log4j。
and
一旦向类路径添加绑定,警告就会消失。
因此,您应该选择要使用哪种绑定。
NoOp绑定(slf4j-nop)
绑定NOP,无声地丢弃所有日志记录。
在https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-nop&core=gav上查看新版本
简单绑定(slf4j-simple)
输出所有事件到System.err。只打印INFO及以上级别的消息。这种绑定在小型应用程序上下文中可能很有用。
在https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-simple&core=gav上查看新版本
日志框架的绑定(java.util。日志,logback, log4j)
如果要将日志写入文件,则需要其中一个绑定。
参见https://www.slf4j.org/manual.html#projectDep上的描述和说明
我的意见
我推荐Logback,因为它是log4j项目的后续产品。
在https://search.maven.org/search?q=g:ch.qos.logback%20AND%20a:logback-classic&core=gav上查看绑定的最新版本
你可以获得控制台输出,但如果你需要将日志写入文件,只需将FileAppender配置放在src/main/resources/logback.xml或src/test/resources/logback-test.xml,就像这样:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/logs.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<logger level="DEBUG" name="com.myapp"/>
</configuration>
(详见手册:https://logback.qos.ch/manual/configuration.html)
您的问题很可能是因为<scope>test</scope>(在某些情况下也<scope>提供</scope>),正如前面提到的@thangaraj。
文档中说:
此范围表示正常情况下不需要依赖项
应用程序的使用,并且仅可用于测试编译
以及执行阶段。测试依赖关系是不可传递的,并且只存在于测试和执行类路径中。
所以,如果你不需要测试依赖项,那么你可以使用代替(你将在mvnrepository中看到的):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.24</version>
<scope>test</scope>
</dependency>
没有任何作用域(默认情况下,如果没有提供其他作用域,则为编译作用域):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
</dependency>
这相当于:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
对我来说,问题是:
在使用Hibernate时,我看到它已经使用了slf4j,而且它已经在我的类路径中,所以我决定使用它。
下一步-为slf4j添加imlementor,所以我添加到maven:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
</dependency>
但是它错误地失败了!SLF4J:加载类“org.slf4j.impl.StaticLoggerBinder”失败
解决方案是:
Hibernate的slf4j依赖项是版本1.7.26,我添加了小版本依赖项1.7.25。当我修复了这个,一切都好了
我没有添加任何依赖项,我只是改变了我使用它们的方式。
预览代码
(如果您使用的是弹性搜索版本< 7.0,则取消注释此代码)
IndexRequest indexRequest = new IndexRequest(
"twitter",
"tweets",
id // this is to make our consumer idempotent
).source(record.value(), XContentType.JSON);
当前代码
IndexRequest indexRequest = new IndexRequest("tweets")
.source(record.value(), XContentType.JSON)
.id(id); // this is to make our consumer idempotent
我使用bulkrequest,并删除了这个错误。
根据SLF4J错误代码
加载org.slf4j.impl.StaticLoggerBinder类失败
当org.slf4j.impl。无法将StaticLoggerBinder类装入内存。当在类路径上找不到合适的SLF4J绑定时,就会发生这种情况。在类路径上放置一个slf4j-nop.jar、slf4j-log4j12.jar、slf4j-jdk14.jar或logback-classic.jar应该可以解决问题。
注意slf4j-api 2.0版本。x和以后使用ServiceLoader机制。后端,如logback 1.3和以后的目标slf4j-api 2。x,不附带org.slf4j.impl.StaticLoggerBinder。如果您放置了一个针对slf4j-api 2.0的日志记录后端。X,在类路径上需要slf4j-api-2.x.jar。参见相关的faq条目。
从SLF4J 1.6版开始,在没有绑定的情况下,SLF4J将默认为一个no-operation (NOP)记录器实现。
如果您负责打包应用程序,并且不关心日志记录,那么将slf4j-nop.jar放在应用程序的类路径上将消除此警告消息。请注意,嵌入式组件(如库或框架)不应该声明依赖于任何SLF4J绑定,而只依赖于SLF4J -api。当库在SLF4J绑定上声明编译时依赖项时,它将该绑定强加给最终用户,从而否定了SLF4J的目的。