15021

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

  • java.lang.ClassCastException: javax.faces.component.StateHolderSaver cannot be cast to [Ljava.lang.O
  • Remote interface cannot be cast to EJB container
  • Bypassing grails view resolvers?
  • Casting JSONArray to Iterable - Kotlin
  • C++ development on linux Code::Blocks, EMACS or GVIM [closed]
  • ggplot2 polygon world map centred with limits gives funny edges
  • HTTP Module intercept requests and breaks custom errors configuration
  • Showing spinner for Rails 3 UJS gets Type error
  • Can my app be notified when another application starts/stops playing audio?
  • Portable JRE on Linux - possible?
  • nodemcu custom firmware build problems
  • perl, mysql - fasting way to upload a csv file into mysql?
  • Problem deserializing objects from cache on MyBatis 3/Java
  • azure media services - The request body is too large and exceeds the maximum permissible limit
  • Setting up SourceTree to merge unity3d scenes with UnityYAMLMerge
  • OpenGL ES texture problem, 4 duplicate columns and horizontal lines (Android)
  • Read a local file using javascript
  • How to avoid particles glitching together in an elastic particle collision simulator?
  • SignalR .NET Client Invoke throws an exception
  • Email format validation in mvc3 view
  • Display issues when we change from one jquery mobile page to another in firefox
  • Is there any way to access browser form field suggestions from JavaScript?
  • C# - Is there a limit to the size of an httpWebRequest stream?
  • Azure Cloud Service Web Role web pages do not load
  • Resize panoramic image to fixed size
  • How to add date and time under each post in guestbook in google app engine
  • Volusion's generic SQL folder, functionality
  • Cross-Platform Protobuf Serialization
  • Function pointer “assignment from incompatible pointer type” only when using vararg ellipsis
  • Why winpcap requires both .lib and .dll to run?
  • Python - Map / Reduce - How do I read JSON specific field in using DISCO count words example
  • Hibernate gives error error as “Access to DialectResolutionInfo cannot be null when 'hibernate.
  • Run Powershell script from inside other Powershell script with dynamic redirection to file
  • How to format a variable of double type
  • Load html files in TinyMce
  • How can I get HTML syntax highlighting in my editor for CakePHP?
  • How do you join a server to an Active Directory (domain)?
  • JaxB to read class hierarchy