由于 log4j,因此无法使用 logback



嗨,我在登录和 slf4j 方面遇到问题,我正在编写简单的应用程序,稍后打包在 jar 中,我想使用登录添加日志记录

我使用:

    <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)

它用于加载日志.xml在JAR文件之外的配置

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

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

问题是为什么他想从org.slf4j.impl投射ch.qos.logback.classic.LoggerContext。Log4jLoggerFactory??

我在任何地方都没有 log4j 的任何库......我的意思是我没有在整个机器上都有它

一个附加信息:在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

由于 SLF4J 在项目或其他继承项目中已经存在依赖关系,因此在运行时可能会出现冲突。向我的POM文件添加排除项对我有用:

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

尝试取出依赖项

<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)

基于这里所说的: 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;
            }
        }
}

我不得不将控制器中的记录器从:

private static final Logger log = LogbackUtil.getLogger( MyController.class );

private static final Logger log = LoggerFactory.getLogger( MyController.class );

最新更新