当前位置: 首页 > 知识库问答 >
问题:

如何将SLF4J与Log4J绑定?

姜弘化
2023-03-14

我正试图用slf4j log4j建立一个项目,但这该死的东西就是不起作用。。。我不断得到例外:

Failed to instantiate SLF4J LoggerFactory
Reported exception:
java.lang.NoClassDefFoundError: org/apache/log4j/Level
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:129)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:108)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:302)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:288)
at TestLog.main(TestLog.java:9)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Level
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Level
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:129)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:108)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:302)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:276)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:288)
at TestLog.main(TestLog.java:9)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Level
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more

我查了一下,班级org.apache.log4j。级别是在我的项目下"Maven依赖

我已经尝试了以下选项:

  1. slf4j api log4j
  2. slf4j api slf4j-log4j12
  3. slf4j api log4j
  4. slf4j api slf4j-log4j12 log4j

这些选项都不起作用:(

这是我的currnet pom。xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sample</groupId>
  <artifactId>DBUnitSample</artifactId>
  <version>1.0</version>

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

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.7</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

  </dependencies>

</project>

此外,我注意到当添加slf4j-log4j12时,它将log4j添加为树中的依赖项,所以我猜测在这里显式添加log4j是多余的,但我还是添加了它。还是没有运气。

我的主要代码非常简单:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SampleDao {
    private static final Logger log = LoggerFactory.getLogger(SampleDao.class);

    public static void main(String[] args) {
        System.out.println("Hello");
        log.info("Logged");
    }
}

还有我的log4j。特性:

log4j.rootLogger=DEBUG, STDOUT
log4j.logger.deng=INFO
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

有人能告诉我我做错了什么吗?我已经尝试过在SO上搜索答案,但所有提到的答案都添加了log4j依赖项,我已经添加了。。。所以不确定,出了什么问题。

共有3个答案

龙玄天
2023-03-14

我和你犯了同样的错误。我根据以下两条建议解决了我的问题。我希望有帮助。

1.修改pom文件:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.2</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.12</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.2</version>
</dependency>

2.将jar添加到启动脚本

java -cp ./lib/log-producer-1.0.4-SNAPSHOT.jar:./lib/slf4j-log4j12-1.7.2.jar:./lib/slf4j-api-1.7.2.jar:./lib/log4j-1.2.12.jar cn.tiakon.core.Bootstrap
洪浩
2023-03-14

如果从命令行运行mvn编译exec: java-D"exec.mainClass"=Sample道,您仍然会出错吗?运行此命令后,我在命令行上看到以下内容,我的机器上有Maven 3.1.1和您的代码:

Hello
 INFO [SampleDao.main()] (SampleDao.java:9) - Logged

所以,您的POM和代码似乎很好。您试图运行代码的方式似乎有问题。

还请注意,以下简化配置应起作用:

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

如果POM有其他依赖项将不同版本的Log4j添加到项目中,则必须指定特定版本的Log4j。

杨安歌
2023-03-14

尝试这些依赖项

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.5</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
    <scope>runtime</scope>
</dependency>
 类似资料:
  • 主要内容:SLF4J 与 Log4j 的区别,为什么 SLF4J 优于 Log4J?SLF4J 与 Log4j 的区别 SLF4J(Simple Logging Façade for java)是一个 API,旨在提供对许多日志框架的通用访问,log4j 就是其中之一。 它基本上是一个抽象层。它不是日志记录实现。这意味着如果您正在编写一个库并且您使用 SLF4J,您可以将该库提供给其他人使用,他们可以选择与 SLF4J 一起使用的日志记录实现,例如 log4j 或 Java 日志

  • 我得到了错误 在我的build.gradle文件中,我有以下一行包含jar log4j-SLF4j-impl-2.0-beta8.jar(我想将其绑定到LOG4J2)

  • 我有一个用Maven构建的RESTJava应用程序。它由一个包含两个模块的项目组成: myapp_server(父项目) myapp_rest myapp_logging 这是父POM: 这是的POM(使用dropwizard中的java简单原型创建): 这是的 POM: 我想让所有日志都通过,以便使用进行日志记录。删除向导在内部使用日志,所以我试图让它使用slf4j。 如果我运行这个项目,我会得

  • 希望是一个简单的问题,但我的google foo让我失望了--我有一个maven项目,我们在其中使用了SLF4J和Log4J1.2绑定。 我们现在想要转移到Log4J2,特别是为了提高性能--但是,我一辈子都找不到Log4J2.0绑定的maven依赖项。我在http://logging.apache.org/log4j/2.x/log4j-SLF4j-impl/上找到了一些注释,但没有提到任何依赖

  • 问题内容: SLF4J的“ Hello World”示例对我不起作用。我猜这是因为我在类路径中添加了slf4j-log4。我应该直接配置log4j以便您好工作吗? 更新 :我添加了log4j初始化,但仍然无法正常工作: 我得到: 问题答案: 如果要使用,则需要在类路径中使用以下文件: slf4j-api-1.6.1.jar slf4j-simple-1.6.1.jar 如果要使用和,则需要在类路径

  • 我收到了一个由另一个开发人员完成的项目(我现在无法与他取得联系)。在该项目中,slf4j用于日志记录。但是我在类路径中看到log4j-1.2.17.jar以及logback-access-1.0.9.jar、logback-classic-1.0.9.jar、logback-core-1.0.9.jar。此外,和文件都在参考资料中。现在我很困惑实际使用的是哪个实现。有人能提出什么建议吗? 类路径中