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

因为log4j不能使用logback

涂溪叠
2023-03-14

嗨,我有问题与logback和slf4j,我写简单的应用程序,后来是包装在罐,我想添加有日志使用logback

即时通讯使用:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.7</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.3</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-client</artifactId>
        <version>5.8.0</version>
    </dependency>

    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>${c3p0.version}</version>
    </dependency>
    <dependency>
        <groupId>commons-pool</groupId>
        <artifactId>commons-pool</artifactId>
        <version>${commons.pool.version}</version>
    </dependency>
    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgresql.version}</version>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>${ehcache.version}</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>${gson.version}</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>${jedis.version}</version>
    </dependency>

我主要有:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
configurator.doConfigure(logbackFile)

用于在jar文件外加载logback.xml配置

最有趣的是,这个程序在本地机器(Windows)上运行(读取logback.xml、创建文件、写入文件),但当我将它上传到远程服务器(linux)时,我出现了奇怪的错误

Exception in thread "main" java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext

问题是他为什么要投ch。向后退。经典来自组织的LoggerContext。slf4j。impl。Log4jLoggerFactory??

我在任何地方都没有log4j的任何lib...我是说我在整个机器上都没有

另外一个信息:在Windows上,我有来自Oracle的Java,在Linux上,我有openjdk——这可能是个问题吗?

//======================依赖关系树

[INFO] +- org.apache.activemq:activemq-client:jar:5.8.0:compile
[INFO] |  +- org.apache.geronimo.specs:geronimo-jms_1.1_spec:jar:1.1.1:compile
[INFO] |  +- org.fusesource.hawtbuf:hawtbuf:jar:1.9:compile
[INFO] |  \- org.apache.geronimo.specs:geronimo-j2ee-management_1.1_spec:jar:1.0.1:compile
[INFO] +- com.mchange:c3p0:jar:0.9.2-pre6:compile
[INFO] |  \- com.mchange:mchange-commons-java:jar:0.2.3.1:compile
[INFO] +- commons-pool:commons-pool:jar:1.6:compile
[INFO] +- postgresql:postgresql:jar:9.1-901.jdbc4:compile
[INFO] +- net.sf.ehcache:ehcache:jar:2.9.0:compile
[INFO] +- com.google.code.gson:gson:jar:2.2.4:compile
[INFO] +- redis.clients:jedis:jar:2.1.0:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.7.5:compile
[INFO] +- ch.qos.logback:logback-classic:jar:1.1.3:compile
[INFO] +- ch.qos.logback:logback-core:jar:1.1.3:compile
[INFO] \- junit:junit:jar:4.11:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test

共有3个答案

梁修贤
2023-03-14

根据这里的说法:https://github.com/dropwizard/dropwizard/issues/1205,初始化库时存在争用条件。我遇到了一个类似的问题,我的程序在NetBeans上运行良好,但在gnome终端上无法运行。竞争条件解释了在多种情况下常见的不一致行为。我不完全理解为什么会发生这种情况,但对于一个特定的案例,这里有一个解决方法:https://gist.github.com/mbknor/34944ea4589a5fc6974c。此示例来自该链接,它可能不适用于上述特定案例,但如果您了解发生的情况,则可能很容易适应特定案例。

static {
        System.out.println("Waiting for slf4j to finish initialization");
        while ( LoggerFactory.getILoggerFactory() instanceof SubstituteLoggerFactory){
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                break;
            }
        }
}
漆雕和昶
2023-03-14

试着消除依赖

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

此依赖项包含在

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

正如您在logback classic pom文件中看到的-http://central.maven.org/maven2/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.pom

还请确保在初始化记录器时,它是按照

private static final Logger LOG = LoggerFactory
            .getLogger(ClassName.class)
辛意智
2023-03-14

由于您的项目或其他继承项目中已经存在SLF4J的依赖项,因此在运行时可能会发生冲突。在我的POM文件中添加排除项对我来说很有效:

    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
 类似资料:
  • 当我尝试在手机的模拟器o中运行“app”时,使用Kotlin的android应用程序抛出了这个异常。当我构建我的项目时,它运行良好,没有错误。 我正在使用: SDK 28(Android 9.0(Pie)) 等级5.1.1 分级插件3.5.0-alpha03 Kotlin 1.3.10 Java 1.8.0_151 OSX 10.13.2

  • 问题内容: 我遇到了一个有趣的问题,其中在运行时找不到org.apache.log4j.Logger类。我正在尝试获得授权,这就是失败的地方: 我正在使用JDeveloper 11.1.1.6。这是我所知道的: 我已经查看了我的UI.war / WEB-INF / lib目录,在那里看到了log4j-1.2.17.jar。 抱怨它的类是org.opensaml.xml.XMLConfigurato

  • 我升级我的混凝土5.7网站从PHP 5.6. x到7.0.4,并得到以下错误 触发这一点的函数本身就是一个具体的5函数。 我能做些什么来解决这个问题? PHP7.0。12-1黛布。苏里。org~trusty 1(cli)(NTS)版权所有(c)1997-2016 PHP Group Zend Engine v3。0.0,版权所有(c)1998-2016 Zend Technologies与Zend

  • 我想使用log4j2作为我的slf4j日志记录应用程序的日志记录实现。 文档说明我必须依赖于log4j-slf4j-impl和log4j-core。 我的问题是为什么log4j-slf4j-impl不依赖于log4j-core(因此带来了它绝对需要的库)?

  • 问题内容: 我正在开发一个Web应用程序,我想记录一些信息以帮助我改进和观察该应用程序。(我正在使用Tomcat6) 首先,我以为我会使用StringBuilders,将日志附加到它们之后,任务将像每2分钟将其持久化到数据库中一样。因为我担心现成的日志系统的性能。然后我做了一些测试。特别是与log4j。 这是我的代码: Main.java LoggerThread.java log4j.prope