记一次Logback集成SSM异常排查

今天在公司里一个比较老旧的SSM系统中集成logback,目的是为了向ELK发送日志,在配置文件和上下文都添加完毕后出现了启动时的异常:

java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext

这种异常还是比较常见的,多出现在maven管理中两个或多个jar版本冲突的情况下,于是开始拆除项目中其他maven引用里的slf4j引用,使用的方法也比较简单,找到对应的jar包(关于如何查找不再描述,可以自行搜索自己使用的编译器如何查看maven引用关系),然后添加以下代码:

1
2
3
4
5
6
<exclusions>
<exclusion>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
</exclusion>
<exclusions>

花了很久拆除了其他引用下的slf4j,再次启动还是报错,此时注意到slf4j的报错

1
2
3
4
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/河蟹下项目名/webapps/ROOT/WEB-INF/lib/activemq-all-5.11.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/河蟹下项目名/webapps/ROOT/WEB-INF/lib/logback-classic-1.1.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

原来问题出在activemq-all这个引用上。点击pom文件里对应的artifactId仔细看了下这个jar包,发现他已经把其他jar包作为自己的文件,而不是引用,怪不得可视试图中没有看到,处理的方式也很简单,把active-mq里的所有引用复制出来,建一个maven的空jar包,复制进去,删除slf4j和log4j的部分,然后把activemq-all的引用替换掉,再次启动就没有问题了,当然也可以直接放在项目对应的pom里,我这么只是觉得有点长