SLF4J:无法加载类“ org.slf4j.impl.StaticLoggerBinder”


619

我的应用程序将同时部署在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

还伴随着 Failed to load class "org.slf4j.impl.StaticMDCBinder"

我已经检查了两个应用程序服务器的类路径,没有其他的slf4j jar。

有谁知道这里可能会发生什么?


文章解决了我的问题
会计师م

Answers:


517

我对WebSphere 6.1有同样的问题。正如Ceki所指出的,WebSphere正在使用大量的jars,其中之一是指向较旧版本的slf4j。

仅当slf4j -1.6+时才会发生No-Op后备,因此任何早于该版本的内容都会引发异常并中止您的部署。

SLf4J站点中有一个文档可解决此问题。我遵循了这一要求,并将其添加slf4j-simple-1.6.1.jar到我的应用程序中slf4j-api-1.6.1.jar

这解决了我的问题。希望它对遇到此问题的其他人有所帮助。


4
是的,错误也在这里提到-slf4j.org/manual.html但是我现在收到一个新错误-由以下原因引起:java.lang.ClassNotFoundException:org.apache.commons.logging.LogFactory
david blaine 2013年

1
“正如Ceki所指出的,WebSphere正在使用大量的jars,其中之一是指向较旧版本的slf4j。” -对于Maven来说,照顾依赖项就太多了!真是笑话。
AndroidDev 2014年


2
我正在使用1.7,并且存在相同的问题。我添加了slf4j-simple-1.7.jar,现在问题已解决。
littletiger 2015年

1
这对我不起作用。slf4j-简单的jar不会拾取log4j.properties。相反,我通过添加slf4j-log4j12和log4j jar使用该实现,这对我来说效果很好。
flyrain

379

这是给那些从Google搜索来到这里的人的。

如果您使用Maven,只需添加以下内容

   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>1.7.5</version>
   </dependency>
   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
       <version>1.7.5</version>
   </dependency>

要么

   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>1.7.5</version>
   </dependency>
   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-simple</artifactId>
       <version>1.6.4</version>
   </dependency>

1
是否有理由slf4j-simple不使用相同的版本slf4j-api?它们可能会很好地协同工作,但是我认为让它们使用相同的版本通常更安全,更好。另外,例如,如果您需要启用仅控制台日志记录,例如在运行单元测试时,这slf4j-simple似乎就足够了(尽管这对我而言)。
Ivaylo Slavov

22
AFAIK您应该只有1个slf4j的impl,即slf4j-log4j12或slf4j-simple,而不是两者。
2014年

@Igor KatKov这仅适用于本地计算机,但是在Jenkins上遇到相同的错误,不确定是怎么回事。可以请你澄清
vikramvi

slf4j-api需要配置,该配置在您首次运行时不可用(并且尚未编辑任何配置文件)。使用slf4j-simple可以使您使用基本的Logger,而无需配置所见即所得的任何文件。一旦您学会了配置文件并按自己的喜好自定义Logger输出,就可以返回slf4j-api。(仍然学习那里的内容以及如何自己编辑它们)
chrips'April

53

只需将其添加到您的pom.xml中

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.21</version>
</dependency>

3
解决方案对我有用;值得指向文档(我在其中找到了解释错误的地方):slf4j.org/codes.html#StaticLoggerBinder
Witold Kaczurba 16/12/23

2
除了运行一个简单的kafka生产者示例,这对我没有任何帮助。谢谢一群!
维伦

@WitoldKaczurba是正确的。我在使用Maven依赖项时遇到了同样的问题。我只是用谷歌搜索并转到slf4j.org/codes.html#StaticLoggerBinder,其中指出了问题及其解决方案。我正在使用slf4j-api版本1.7.25。在检查了提到的链接的文档后,我只使用了<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> </dependency>,问题已解决
Mohammad Anas

如果需要某些记录器的库(例如需要slf4j的Handlebars)没有在pom中声明它,我不明白使用Maven的意义。无论如何:谢谢。
Eric Duminil

就我而言,这不是解决方案。只是隐藏信息,即slf4j和log4j或其他插件的版本不兼容。
hariprasad

42

您需要在类路径中添加以下jar文件:slf4j-simple-1.6.2.jar。如果没有,请下载。请参考http://www.slf4j.org/codes.html#multiple_bindings


但是我的tcServer类路径上没有那个jar,这使我感到困惑。我不明白如何在tcServer中不需要额外的jar,而在WebSphere中这样做
JJ180 2011年

1
为我工作,比接受的答案简单得多。版本1.7.7也起作用。
La-comadreja 2014年

1
我已经jul-to-slf4j在我的pom.xml,只是加入slf4j-simple之前,它工作正常。
slugmandrew 2014年

如何简单地将jar文件添加到类路径?
Dean013

拜托,你能解释一下上课的路径吗?哪里?我不明白
Rose8525

36

这里有很多答案,建议将slf4j-simple依赖项添加到您的maven pom文件中。您可能需要检查最新版本。

https://mvnrepository.com/artifact/org.slf4j/slf4j-simple 您可以找到最新版本的SLF4J简单绑定。选择最适合您的套件(2019-02的1.7.26仍是2019-07的稳定版本)并将其包含在pom.xml中。

为了您的方便,此处显示了一些依赖关系-但是当您阅读本文时,它们可能不是最新的!

2019-10的Alpha版

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-simple</artifactId>
   <version>2.0.0-alpha1</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>

稳定版2019-12

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-simple</artifactId>
   <version>1.7.30</version>
</dependency>

由于以下评论,我删除了示波器测试部分。


6
你为什么用<scope>test</scope>?以我的经验,我至少需要runtime确保范围slf4j-simple在类路径上。很好奇您如何test
使它

感谢您指出这一点。我从答案中删除了范围标签。这是一个剪切和粘贴问题-我提供的链接以这种方式提供了beta依赖性。
Wolfgang Fahl,

27

我面临着同样的错误。我在本地开发中配置了slf4j-api,slf4j-log4j12和log4j。所有配置都很好,但是我从mvnrepository复制的slf4j-log4j12依赖项具有测试范围<scope>test</scope>。当我删除此内容时,一切都很好。

有时候愚蠢的错误会伤我们的脑袋;)


1
太感谢了!我遇到了同样的问题,在我找到您的帖子之前将其放弃!
Ergodyne

1
这也帮助了我
cod3min3

27

有时我们应该看到警告语中的音符SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

当在类路径上找不到合适的SLF4J绑定时,会发生这种情况

您可以搜索出现此警告的原因。
添加JAR的一个从*slf4j-nop.jarslf4j-simple.jarslf4j-log4j12.jarslf4j-jdk14.jarlogback-classic.jar*到类路径中应该解决的问题。

compile "org.slf4j:slf4j-simple:1.6.1"

例如,将以上代码添加到您build.gradle的代码或与pom.xmlmaven项目对应的代码中。


15

将文件slf4j-log4j12-1.6.4.jar放在类路径中将解决问题。


6
或将依赖项添加到您的pom中<dependency> <groupId> org.slf4j </ groupId> <artifactId> slf4j-log4j12 </ artifactId> </ dependency>
enkor 2013年

11

如果您正在使用Maven进行依赖管理,则可以在pom.xml中添加以下依赖

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.5.6</version>
</dependency>

对于非Maven用户,只需下载该库并将其放入您的项目类路径中即可。

在这里您可以看到详细信息:http : //www.mkyong.com/wicket/java-lang-classnotfoundexception-org-slf4j-impl-staticloggerbinder/


1
同样,对于Maven用户,我发现我需要将以下内容添加到pom.xml中,该文件也将自动引入logback-core:<dependency> <groupId> ch.qos.logback </ groupId> <artifactId> logback-classic </ artifactId> <version> 1.0.9 </ version> </ dependency>
Paul

2
This is not an error. This message tells you that you do not have any logger implementation (such as e.g. Logback) added in classpath, and therefore NOP (No Operation) log 查找@Paul提到的sarxos注释,需要添加logback-classic。更改为<artifactId>slf4j-simple</artifactId>from的另一种方法<artifactId>slf4j-api</artifactId>也可以完成工作。它说明在这里
Abhijeet

10

SLF4j是各种日志框架的抽象。因此,除了拥有slf4j之外,您还需要在类路径中包括任何日志记录框架,例如log4j或logback(etc)。
有一个想法指的第一个孩子步骤http://logback.qos.ch/manual/introduction.html


2
添加logback为我解决了这个问题。我将最新的logback classic放入pom(1.1.7),但失败了,因为slf4j依赖项太旧(1.6.2)。将logback降级到1.0.0并将slf4j保留在1.6.x上是可行的,将slf4j升级到1.7.20并将logback保留在1.1.7上也可以。
ECDragon'Apr 9'16

5

Slf4j是诸如log4j,logback,java.util.logging之类的基础日志记录框架的外观。

为了与基础框架连接,slf4j使用了绑定。

  • log4j-slf4j-log4j12-1.7.21.jar
  • java.util.logging-slf4j-jdk14-1.7.21.jar等

如果缺少绑定jar,则会引发以上错误。您可以下载此jar并将其添加到classpath。

对于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


您的解决方案是唯一对我有用的解决方案,谢谢!
Edenshaw

5

我在使用带有Java 9库的Spring-boot-2应用程序时遇到了类似的问题。

在我的pom.xml中添加以下依赖项为我解决了这个问题:

    <dependency>
        <groupId>com.googlecode.slf4j-maven-plugin-log</groupId>
        <artifactId>slf4j-maven-plugin-log</artifactId>
        <version>1.0.0</version>
    </dependency>

4

在Websphere情况下,您具有slf4j-api.jar 1.4.x的旧版本。或躺在某处的1.5.x。您在tcServer上观察到的行为(即故障转移到NOP)在slf4j 1.6.0及更高版本上发生。确保在所有平台上都使用slf4j-api-1.6.x.jar,并且没有将较旧版本的slf4j-api放置在类路径中。


谢谢,我检查了我的WebSphere 6.1类路径,但没有看到其他任何版本的slf4j,例如,我在WebSphere文件系统上搜索了slf4j jar,而我只得到了1.6版本。您知道WebSphere是否随附slf4j吗?
JJ180 2011年

一切皆有可能,但如果WebSphere与slf4j-api捆绑在一起,我将感到非常惊讶。焊接捆绑包slf4j-api.jar。您在使用Weld吗?
Ceki

4

当出现以下错误时,我陷入了这个问题:

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在我的笔记本上的时候libs

尽管我尝试使用整个建议的补罐,例如slf4j-log4j12-1.7.5.jarslf4j-simple-1.7.5但错误消息仍然存在。当我添加slf4j-jdk14-1.7.5.jar到Java库时,问题终于解决了。

http://www.slf4j.org/download.html上获取整个slf4j软件包


4

请向pom添加以下依赖项以解决此问题。

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.25</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>

我只是包括了第一个依赖项(如另一个答案中指出的那样),它可以工作。这两个依赖关系都不能解决我的问题。
RubioRic

并希望使用本地Maven代替Intellij的捆绑Maven。
阿卜杜勒·加法尔

4

作为jar包含和纯Maven解决方案的替代方法,您可以将Maven与gradle一起包含。

版本示例 1.7.25

// https://mvnrepository.com/artifact/org.slf4j/slf4j-simple
api group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'

将其放入build.gradle文件的依赖项中。


3

我在Struts2 + Spring项目中工作。所以它需要一个依赖slf4j-api-1.7.5.jar

如果我运行该项目,则会出现类似以下错误

无法加载类“ org.slf4j.impl.StaticLoggerBinder”

我通过添加来解决了我的问题slf4j-log4j12-1.7.5.jar

因此,将此jar添加到您的项目中即可解决该问题。


3

SLF4J手册所述

Java的简单日志记录外观(SLF4J)可作为各种日志记录框架(如java.util.logging,logback和log4j)的简单外观或抽象。

将绑定添加到类路径后,警告将消失。

因此,您应该选择要使用的绑定。

NoOp绑定(slf4j-nop)

绑定NOP,静默丢弃所有日志记录。

https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-nop&core=gav检查新版本

简单绑定(slf4j-simple)

将所有事件输出到System.err。仅打印I​​NFO或更高级别的消息。在小型应用程序的上下文中,此绑定可能很有用。

https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-simple&core=gav检查新版本

日志记录框架的绑定(java.util.logging,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


3
     <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.21</version>
    </dependency>

将上面提到的依赖项放在pom.xml文件中


但是请记住检查最新版本。
user1053510


1

根据SLF4J官方文档

无法加载类org.slf4j.impl.StaticLoggerBinder

无法将org.slf4j.impl.StaticLoggerBinder类加载到内存时,将报告此警告消息。当在类路径上找不到合适的SLF4J绑定时,就会发生这种情况。 slf4j-nop.jar,slf4j-simple.jar,slf4j-log4j12.jar,slf4j-jdk14.jar或logback-classic.jar中的一个(仅一个)放置在类路径上即可解决此问题。

只需将此jar和slf4j api.jar一起添加到您的类路径中即可完成工作。祝你好运



1

在payara 5.191上遇到了相同的问题

jcl-over-slf4j与slf4j-log4j12一起解决了这个问题

<properties>
  <slf4j.version>1.7.29</slf4j.version>
</properties>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>${slf4j.version}</version>
  <type>jar</type>
</dependency> 

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>${slf4j.version}</version>
</dependency>        

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>${slf4j.version}</version>
</dependency>

0

我知道这篇文章有些旧,但是万一其他人遇到了这个问题:

将slf4j-jdk14-XXXjar添加到您的CLASSPATH中(其中XXX是版本号-例如slf4j-jdk14-1.7.5.jar)。

彼得


1
您是否建议用户应还原到JDK1.4日志记录以解决类路径问题?另请参阅
mwhs 2013年

0

我使用耶拿(Jena),并将同伴依赖项添加到pom.xml

<dependency> 
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.0.13</version>
</dependency>

我尝试添加slf4j-simple,但它消失了“ SLF4J:无法加载类” org.slf4j.impl.StaticLoggerBinder”的错误,但经典的logback显示了更多详细信息。

公文


0

解决方案在其官方网站上显示:

无法加载类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。

解决方案:我已使用intellij上的maven研究将其添加到我的项目中,并且选择了slf4j-jdk14.jar。


0

@thangaraj所述,您的问题很可能是由于<scope>test</scope>(在某些情况下也是<scope>provided</scope>原因所致

文档说:

此范围表明该依赖关系对于正常使用该应用程序不是必需的,并且仅在测试编译和执行阶段可用。测试依赖项不是可传递的,仅对于测试和执行类路径存在。

因此,如果您不需要依赖来进行测试,则可以使用代替(在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>


0

对我来说,问题是:使用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”

解决的办法是:SLF4J的Hibernate的依赖是版本1.7.26,和我添加的次要版本的依赖1.7.25。所以当我解决这个问题-一切都OK了


0

我没有添加任何依赖关系,只是改变了使用它们的方式。

预览码

(如果您使用的是弹性搜索版本<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,因此删除了该错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.