因为log4j版本有漏洞,需要升级版本。但是从1到2,又加上环境比较老,就不只是换个包就完事了。由于这个项目年代久远,用的都是tomcat,而我已经好久没用过tomcat,只记得怎么启动,不记得具体配置逻辑了。所以升级版本以后,虽然项目能正常运行,但日志和管理台一直无法正常输出。明明改了配置,还是去读的log4j1.x的版本信息,也就是原来的配置。于是整理了一下需要改的几个点,应该能解决tomcat+log4j2的问题了。
maven导入log4j2.7.1版本
可以点击项目右侧查询依赖log4j的依赖关系,如果是别的包里引入了log4j.需要在对应的maven下过滤
题外话
我导入的是log4j-slf4j过渡版本,但如果你没有用slf4j的话,可以直接用log4j就行了。主要是我搞不清楚这个老项目用的是log4j还是slf4j,所以干脆就导入了这个,比较省事。不过后来想想,其实应该没有用slf4j,毕竟我改了很多直接用Logger.getLogger()获取日志的代码。
这么想想,slf4j确实比较好用。像这种要升级版本的情况,我们还得改具体代码,虽说全局替换一下工作量也不是很大,但一个个导入终归还是劳神,不小心换错了也不方便。如果用的是slf4j,那只需要换下包就好了。
<dependency>
<groupId>com.example</groupId>
<artifactId>example-common</artifactId>
<exclusions>
<!--排除log4j依赖-->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--指定2.17.1版本log4j依赖,注意groupId和1不一样。-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.1</version>
</dependency>
<!--指定web注册需要的监听器-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.17.1</version>
</dependency>
代码更换
根据官网说明,从1升级到2,有的方法需要进行替换。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
// 1.x的用法
private static Logger logger = Logger.getLogger(Example.class);
// 2.x的用法
private static Logger logger = LogManager.getLogger(Example.class);
web.xml注册
一般来说,按照上述的改动就升级成功了。但是我这边日志什么内容都没有,果然tomcat就是比较麻烦。现在应该也没啥人用了,网上搜都是陈年的老旧内容了……
注册参数
说回正题,注册的元素这里两个都要改。一个是log4jConfiguration,一个是WEB-INF/log4j2.xml.
这里说一下,需要在对应目录下创建log4j2.xml。
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/WEB-INF/log4j2.xml</param-value>
<!-- 原配置内容-->
<!-- <param-value>/WEB-INF/log4j.properties</param-value>-->
</context-param>
注册监听器
1.x版本的监听器是spring自带的,他会去找参数名字为log4jConfigurationLocation的配置。所以即使上一步都改对了,也无法正确打印日志。需要引入web-log4j2的包,也就是我前面maven里面的第二个依赖。
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener
</listener-class>
</listener>
over
好了,这样就能成功输出日志了。