Java 由于log4j,无法使用logback

Java 由于log4j,无法使用logback,java,slf4j,logback,Java,Slf4j,Logback,嗨,我有问题的logback和slf4j,我写的简单的应用程序,后来是包装在jar,我想添加那里的日志使用logback 即时通讯使用: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </

嗨,我有问题的logback和slf4j,我写的简单的应用程序,后来是包装在jar,我想添加那里的日志使用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>
它用于在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
问题是,他为什么要从org.slf4j.impl.Log4jLoggerFactory中转换ch.qos.logback.classic.LoggerContext

我没有任何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

试图消除依赖关系

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

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

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

org.slf4j
slf4j-log4j12

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

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


因为您试图获取LoggerFactory并将其强制转换为LoggerContext:
LoggerContext LoggerContext=(LoggerContext)LoggerFactory.GetilogerFactory()
您能否提供应用程序的整个依赖关系树?似乎在类路径的某个地方有slf4j-log4j。这是log4j binding.updated,我在查看依赖关系树,但没有看到任何与log4j@TomaszCy-man请发布
mvn dependency:tree
(在主项目中运行)的输出,或者发布mvn dependency:tree的结果,或者至少提供依赖项的版本。如果确定部署中没有org.slf4j:slf4j-log4j依赖项,请检查linux机器上应用程序的(类)路径。org.slf4j.impl.Log4jLoggerFactory类必须来自某个地方。
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
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 );