Log4j 1停止官方维护
前段时间Log4j2.x爆出来的漏洞炸开了锅,有些人打开自己的项目一看使用的是Log4j1.x,瞬间送了一口气。
不过话说回来,改升级还是得升级,生活还是得继续,Log4j也是也得往前看。
早在2015年,Apache软件基金会就宣布Log4j 1.x不再提供官方支持,推荐大家升级到Log4j 2.x。
摘要:
- Log4j 1从1999年第一次发布到2015年终止维护(End-Of-Life)
- 在整个生命周期,release了21次,上次release是2012年
- Log4j 2不是log4j 1的下一个版本,是一个完全重写的项目
- 作者们都在开发Log4j2了,Log4j 2更快更稳定更强大
总而言之,就是极力推荐大家用Log4j 2.
Log4j的迁移
可能有很多旧项目,使用的是Log4j1.x 的API,如果我们改成Log4j 2.x该怎么办呢?
1 选项1:使用Log4.1 桥(log4j-1.2-api)
如果我们完全不想修改Java代码,我们可以使用这种方法。
这种方式使用的桥接模式!有点挂羊头卖狗肉的味道。
1.1 创建Log4j 1测试项目
- 引入log4j 1的依赖
dependencies {
testCompile 'log4j:log4j:1.2.17'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
- 在resource目录下放置log4j 1的配置文件
src/test/resources/log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/' >
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p %C{2} (%F:%L) - %m%n"/>
</layout>
</appender>
<root>
<priority value ="info" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
- 新建测试类,使用log4j 1的api打印日志
import org.apache.log4j.Logger;
import org.junit.Test;
public class Log4jTest {
Logger logger = Logger.getLogger(Log4jTest.class);
@Test
public void test(){
logger.info("Hello Log4j");
}
}
- 运行测试类,因为我们使用的是ConsoleAppender,所以日志打印到了控制台
INFO com.pupu.testlab.log4j.Log4jTest - Hello Log4j
1.2 使用log4j 1.x 桥
除了引入log4j 2.x必要的依赖,最重要的还需要引入log4j-1.2-api.jar
下面我们可以看到log4j 1.x的依赖我们已经移除了。
dependencies {
testImplementation 'org.apache.logging.log4j:log4j-1.2-api:2.17.1'
testImplementation 'org.apache.logging.log4j:log4j-api:2.17.1'
testImplementation 'org.apache.logging.log4j:log4j-core:2.17.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
1.3 配置迁移
因为我们只是在Java代码中使用了log4j1.x的API,但真正使用的是log4j 2,所以理所当然,我们也要使用log4j2.x的配置。log4j1和2的配置有一些不同,详细请参考文档。
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%p %C{2} (%F:%L) - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
启动测试类,查看日志:
INFO log4j.Log4jTest (Log4jTest.java:11) - Hello Log4j
至此,我们完全不用修改Java代码,只需引入log4j2的依赖,并修改log4j的配置即可。
2 选项2:将应用转换成Log4j 2 API(log4j-api)
相比于前面的挂羊头卖狗肉,这种方法更直接彻底,修改Java代码,直接用log4j2的api和实现。
当然缺点是,需要批量修改Java代码中的包名和log变量的声明,这里可以自定义正则表达式批量修改。
2.1 引入log4j 2的依赖
dependencies {
testImplementation 'org.apache.logging.log4j:log4j-api:2.17.1'
testImplementation 'org.apache.logging.log4j:log4j-core:2.17.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
2.2 修改代码中的API
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
public class Log4jTest {
private static final Logger logger = LogManager.getLogger(Log4jTest.class);
@Test
public void test(){
logger.info("Hello Log4j");
}
}