Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Logback and Jboss 7 - don't work together?

I am having a curious problem. I had this Java application which was previously deployed in tomcat and happily used logback classic as an slf4j implementation. Now when we tried to deploy the same app in a jboss 7.1.final server it doesn't even deploy the application maoning about java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext This is the offending line of code

final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

The class that has his is spring injected and that is failing - hence the whole application cannot be deployed. Anyone got a solution to this? Thanks in advance

After looking in this site plus other forums I realised that Jboss 7 comes bundled with it's own slf4j implementation and implement the same ILoggerFactory interface that LoggerContext in logback does. Our application tried to get an instance of the same but the app server imposes it's own slf4j implementation.

I tried to modify the module.xml in jboss\modules\org\slf4j\impl\main and pointed it to logback jars.

<resources>     <resource-root path="logback-classic-0.9.28.jar"/>     <resource-root path="logback-core-0.9.28.jar"/> </resources> 

Now when I start the application I am getting a serious error

Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext

I am at my wits end. Any jboss and logback experts can help? Thanks in advance

like image 428
Soumya Avatar asked Mar 01 '12 15:03

Soumya


2 Answers

You need to exclude the servers version of slf4j from your deployment. Create a jboss-deployment-structure.xml file and place it in either your WARS META-INF or WEB-INF directory.

The contents of the file should look like this:

<jboss-deployment-structure>     <deployment>         <!-- Exclusions allow you to prevent the server from automatically adding some dependencies     -->         <exclusions>             <module name="org.slf4j" />             <module name="org.slf4j.impl" />         </exclusions>     </deployment> </jboss-deployment-structure> 
like image 106
James R. Perkins Avatar answered Oct 04 '22 15:10

James R. Perkins


If you are using the bridges for jul or jcl in your app, you should exclude them too:

        <module name="org.slf4j" />         <module name="org.slf4j.jcl-over-slf4j" />         <module name="org.slf4j.impl" />         <module name="org.jboss.logging.jul-to-slf4j-stub" /> 
like image 27
Torsten Krah Avatar answered Oct 04 '22 16:10

Torsten Krah