Logback和Jboss 7 - 不能一起工作?

时间:2012-03-01 15:13:39

标签: jboss7.x logback

我有一个奇怪的问题。我有一个以前部署在tomcat中的Java应用程序,并且很高兴地使用logback classic作为slf4j实现。现在,当我们尝试在jboss 7.1.final服务器中部署相同的应用程序时,它甚至不会部署应用程序maoning java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext 这是令人讨厌的代码行

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

拥有他的类是弹簧注入而且失败 - 因此无法部署整个应用程序。有人有解决方案吗?提前致谢

在查看此站点和其他论坛后,我意识到Jboss 7捆绑了它自己的slf4j实现,并实现LogbackContext在logback中执行的相同ILoggerFactory接口。我们的应用程序尝试获取相同的实例,但应用服务器强加了它自己的slf4j实现。

我尝试修改jboss \ modules \ org \ slf4j \ impl \ main中的module.xml,并将其指向logback jar。

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

现在,当我启动应用程序时,我遇到了严重的错误

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

我在我的智慧结束。任何jboss和logback专家都可以提供帮助吗? 提前致谢

3 个答案:

答案 0 :(得分:58)

您需要从部署中排除slf4j的服务器版本。创建一个jboss-deployment-structure.xml文件并将其放在WARS META-INFWEB-INF目录中。

文件的内容应如下所示:

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

答案 1 :(得分:7)

如果您在应用中使用jul或jcl的桥接器,则应将它们排除在外:

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

答案 2 :(得分:3)

还有另一种方法:

  • 你在战争中配置了日志
  • 你在战争中得到了所有依赖
  • 你没有在JBoss服务器目录中配置任何东西,甚至没有配置其他JBoss模块

完全禁用JBoss日志记录并依赖战争中的依赖关系。按如下方式修改jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
    <deployment>
        <exclusions>
            <module name="org.apache.commons.logging" />
            <module name="org.apache.log4j" />
            <module name="org.jboss.logging" />
            <module name="org.jboss.logging.jul-to-slf4j-stub" />
            <module name="org.jboss.logmanager" />
            <module name="org.jboss.logmanager.log4j" />
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
            <module name="org.slf4j.jcl-over-slf4j" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

部署应用程序后,bootstrap日志记录(boot.log)也会继续工作,server.log将显示部署日志记录。但是你的所有应用程序都是通过你的战争中的(在这个例子中)slf4j + logback记录的。

请注意,您不需要使用-Dorg.jboss.logging.provider=slf4j运行JBoss,如果您指定了它,则需要提供JBoss模块(通常为slf4j-api,logback-classic和logback-core),但它不是值得努力,因为JBoss日志记录现在仅用于bootstrap(boot.log)和部署信息(server.log)。

参考文献:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://stackoverflow.com/a/19695680/2587343