我有一个奇怪的问题.我有一个以前部署在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();Run Code Online (Sandbox Code Playgroud)
拥有他的类是弹簧注入而失败 - 因此整个应用程序无法部署.有人有解决方案吗?提前致谢
在查看此站点和其他论坛后,我意识到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>
Run Code Online (Sandbox Code Playgroud)
现在,当我启动应用程序时,我遇到了严重的错误
Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext
我没办法.任何jboss和logback专家都可以提供帮助吗?提前致谢
Jam*_*ins 59
您需要从部署中排除slf4j的服务器版本.创建一个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>
Run Code Online (Sandbox Code Playgroud)
如果您在应用程序中使用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" />
Run Code Online (Sandbox Code Playgroud)
有替代方法:
只需完全禁用 JBoss 日志记录并依赖 war 中的依赖项。编辑你的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>
Run Code Online (Sandbox Code Playgroud)
部署应用程序后,引导程序日志记录 (boot.log) 会继续工作,server.log 也会显示部署日志记录。但是你的所有应用程序都是通过你的(在这个例子中)slf4j+logback 在你的战争中记录的。
请注意,您不需要使用 运行 JBoss -Dorg.jboss.logging.provider=slf4j,如果您指定它,您将需要提供 JBoss 模块(通常是 slf4j-api、logback-classic 和 logback-core),但这不值得付出努力,因为 JBoss 日志记录是现在仅用于引导程序 (boot.log) 和部署信息 (server.log)。
参考资料:
http : //tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
/sf/answers/1378697631/
| 归档时间: |
|
| 查看次数: |
18319 次 |
| 最近记录: |