logback更新到1.3版本tomcat无法启动问题解决

问题

银联漏洞扫描,说logback1.1.3有漏洞不让用了,必须要更新到1.3.0-alpha5,mave依赖改完之后,发现无法启用,缺少类,然后吧slf4j-api-1.7.5更新到slf4j-api-2.0.0-alpha1,还是无法启动,报找不到StaticLoggerBinder,对比logback-classic jar包果然发现没有StaticLoggerBinder了,啥情况?

解决过程

1. 上slf4j官网看看,
logback更新到1.3版本tomcat无法启动问题解决_第1张图片
意思就是说slf4j-api 1.8之后的版本不再使用静态绑定了,就是不需要StaticLoggerBinder了,用的是serviceLoader机制了

2. 查看logback-classic-1.3.0-alpha5.jar 果然发现下图的内容,意思就是说jar包引入就可以了,logback框架会自动加载,不用我们管理了,那为什么还是报找不到StaticLoggerBinder的异常呢?
logback更新到1.3版本tomcat无法启动问题解决_第2张图片
3. 仔细查看tomcat启动时的日志发现,异常之前logback已经加载过一次了,是在第二次加载的时候报的异常,竟然会加载两次?什么鬼?然后尝试把web.xml中LogbackConfigListener删除,发现可以启动工程了,果然不用我们自己负载logback的加载了。 但是又发现另一个问题

4. 由于我们logback.xml中使用

<property name="LOG_HOME" value="${logs.home}" />

来配置日志的输出位置,logback找不到这个变量了,日志都输出到tomcat下面了,那为啥更新之前就可以呢

5. 梳理tomcat的启动流程
logback更新到1.3版本tomcat无法启动问题解决_第3张图片
所以可以正常启动

6. jar更新后的流程,变更如下
logback更新到1.3版本tomcat无法启动问题解决_第4张图片
logback提前了,当然拿不到设置的logs.home系统变量了

7. 那自己也写个类让serviceLoader加载,如果能在logback加载之前执行是不是就ok了?serviceLoader扫秒到两个实现类,是如何决定执行顺序的?logback的是LogbackServletContainerInitializer,那么建立一个比这边排序靠前的类名InitInitializer试试,并在InitInitializer中读入配置文件,写入环境变量中,工程中做如下配置
在这里插入图片描述
8. 启动工程,发现可以读取到,问题解决

你可能感兴趣的:(问题解决,logback)