coudnt use logback because of log4j

Hi i have problems with logback and slf4j, im writing simple app that later is packaging in jar and i want to add there logging using logback

im using:

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

in Main i have:

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

it used for load logback.xml configuration outside of jar file

The funniest thing is that this program is working on local machine (Windows) (reading logback.xml, create file, write to file) but when i upload it to remote server (linux) i have strange error

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

the question is why he want to cast ch.qos.logback.classic.LoggerContext from org.slf4j.impl.<strong>Log4jLoggerFactory</strong>??

I dont have anywhere any lib of log4j... i mean i dont have it on entire machine

one additional info: on Windows i have Java from Oracle and on Linux i have openjdk - it can be a problem?

//=================dependency tree

[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

Answer1:

Due to an already existing dependency of SLF4J in your project or in some other inherited project, there might be conflicts during runtime. Adding an exclusion to my POM file worked for me:

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

Answer2:

Based on what it says here: https://github.com/dropwizard/dropwizard/issues/1205 , there is a race condition with initializing the libraries. I was having a similar problem where my program worked fine on NetBeans, but didn't work in a gnome terminal. A race condition explains the inconsistent behavior common in multiple cases. I don't fully understand why this happens, but there is a workaround here for a specific case: https://gist.github.com/mbknor/34944ea4589a5fc6974c . This example is from that link, it may not be applicable to the specific case mentioned above but can probably be adapted for specific cases fairly easily if you understand what's going on.

static { System.out.println("Waiting for slf4j to finish initialization"); while ( LoggerFactory.getILoggerFactory() instanceof SubstituteLoggerFactory){ try { Thread.sleep(50); } catch (InterruptedException e) { break; } } }

Answer3:

Trying taking out the dependency

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

This Dependency is included in

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

As you see in the logback-classic pom file - http://central.maven.org/maven2/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.pom

Also make sure that when you initialize your logger that it is modeled after

private static final Logger LOG = LoggerFactory .getLogger(ClassName.class)

Answer4:

I had to switch the logger in my controller from:

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

to

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

人吐槽 人点赞

Recommend

Comment

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:coudnt use logback because of log4j