最近log4j2爆出有重大漏洞问题,公司也紧急要求各个项目自己查验,要求将log4j的版本升到安全版本
目前我们使用的是springboot 1.5.9版本,内置log4j2是2.7的版本,虽然整合了mybatis,但是log4i的版本依然是以springboot内置为主
2个方案,一个是官方提供的,个人推荐,另一个是根据网上的总结出来的,测试结果也是对的
方法一:spring官网推荐(强烈建议用官网的)情况一:直接用soringboot父pom的,类似如下的(推荐如下方式)https://spring.io/blog/2021/12/10/log4j2-vulnerability-and-spring-boot
官网介绍了2种情况,
org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE
这种情况下的,就需要在自己项目的pom.xml文件中添加如下代码
2.16.0
若果自己项目的pom.xml文件里已经有
情况二:没有将springboot的pom文件作为父pom,而是当作依赖引入的这边补充一下原因,
可以覆盖父类pom文件里引入的依赖的版本
改完以后,可以自己看下自己项目的依赖版本是否升级了,我这边是选择升级到2.15的版本
用这种方式的好处是,你不需要一个一个去找,基本只要父pom设置好了,其他的基本就会同步升级
... other dependencies including spring-boot-dependencies org.apache.logging.log4j log4j-bom 2.16.0 import pom
具体的我没有试过,只是把官网的翻译了一下,版本自己选择
方式二 直接说怎么改(这个是同事改的,我直接拿过来用了)父pom.xml
org.springframework.boot spring-boot-starter-log4j2 org.apache.logging.log4j log4j-api org.apache.logging.log4j log4j-core org.apache.logging.log4j log4j-slf4j-impl org.apache.logging.log4j log4j-api 2.15.0 org.apache.logging.log4j log4j-core 2.15.0 org.apache.logging.log4j log4j-slf4j-impl 2.15.0
web模块的pom.xml
org.apache.logging.log4j log4j-web org.apache.logging.log4j log4j-api org.apache.logging.log4j log4j-core org.apache.logging.log4j log4j-api 2.15.0 org.apache.logging.log4j log4j-core 2.15.0 org.apache.logging.log4j log4j-slf4j-impl 2.15.0
原理说一下:就是将原本依赖里需要的有关log4j的jar包依赖剔除掉,
, ,然后重新引入需要的jar包,标明版本即可
之前网上有人写了一段代码
将pom文件里如下代码进行替换,启动项目时报错了
原:
org.springframework.boot spring-boot-starter-log4j2
替换为:
org.springframework.boot spring-boot-starter-log4j2 org.apache.logging.log4j log4j-api org.apache.logging.log4j log4j-core org.apache.logging.log4j log4j-api 2.15.0 org.apache.logging.log4j log4j-core 2.15.0
我试了一下,替换后报错了,我原本内置log4j版本是2.7的
替换后,一直报错,项目起不来,classNotFound
java.lang.NoClassDefFoundError: org/apache/logging/log4j/util/ReflectionUtil at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:42) at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47) at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304) at com.sunmnet.ybt.ApplicationConfig.(ApplicationConfig.java:59) Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.util.ReflectionUtil at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ... 6 more Exception in thread "main"
这里我说下我这边的原因,有兴趣的可以看下
我去2.7版本里找了一下,有这个类,但是2.15版本确实没有这个类,我看了一下我整个项目的依赖,发现了一个问题,
发现问题没有?上面2个jar包版本升级了,但是还有2个没有
而且,我在web模块引入了一个log4j-web的依赖,它的版本是2.7,而这个依赖又需要log4j-api和log4j-core,这两个的版本又升级了,版本不一致的问题导致出现了有的类找不到,是这个依赖的版本出问题了,也要升级。
就很麻烦,你需要去每个模块的pom文件看看有没有单独引入有关log4j的依赖,所以强烈建议按照spring官网推荐那样设置
总而言之,我之所以出现上面的问题是因为,有其他地方单独引入与log4j相关的依赖,且版本与你升级的不一致。(如有觉得说的不对的,欢迎指出)。所以非常建议使用spring官网推荐的方式升级log4j2版本的方式,除非你十分清楚你的项目,知道哪些地方有有关log4j2的依赖



