Logback和Jboss 7 – 不一起工作?
我有一个好奇的问题。 我有这个以前部署在tomcat中的Java应用程序,并且愉快地使用logback classic作为slf4j实现。 现在,当我们尝试在jboss 7.1.final服务器上部署相同的应用程序时,它甚至不会部署应用程序,从而导致java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
这是违规的代码行
final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
有他的class级是弹簧注入,这是失败的 – 因此整个应用程序不能部署。 任何人有解决这个问题? 提前致谢
在查看这个站点和其他论坛后,我意识到Jboss 7捆绑了它自己的slf4j实现,并实现了LoggerContext在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专家都可以提供帮助吗? 提前致谢
您需要从部署中排除slf4j的服务器版本。 创build一个jboss-deployment-structure.xml
文件,并将其放在WARS META-INF
或WEB-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>
如果您在应用程序中使用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" />
有另一种方法:
- 你在你的战争中configuration了日志logging
- 你在战争中得到了所有的依赖
- 你不需要在JBoss服务器目录中configuration任何东西,甚至不需要额外的JBoss模块
只要彻底禁用JBoss日志logging,并依赖于战争中的依赖关系 。 编辑你的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>
一旦你部署你的应用程序,引导logging(boot.log)继续工作也server.log将显示部署日志logging。 但是所有的应用程序都是通过你的(在这个例子中)slf4j + logback在你的战争中login的。
注意你不需要运行带有-Dorg.jboss.logging.provider=slf4j
JBoss,如果你指定了这个,你需要提供JBoss模块(通常是slf4j-api,logback-classic和logback-core),但是是不值得的,因为JBoss日志logging现在仅用于引导(boot.log)和部署信息(server.log)。
参考文献:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://stackoverflow.com/a/19695680/2587343