从Log4j1.x 迁移到 Log4j2.x

Log4j 1停止官方维护

前段时间Log4j2.x爆出来的漏洞炸开了锅,有些人打开自己的项目一看使用的是Log4j1.x,瞬间送了一口气。

不过话说回来,改升级还是得升级,生活还是得继续,Log4j也是也得往前看。

早在2015年,Apache软件基金会就宣布Log4j 1.x不再提供官方支持,推荐大家升级到Log4j 2.x。

完整的官方说明点这里

摘要:

  1. Log4j 1从1999年第一次发布到2015年终止维护(End-Of-Life)
  2. 在整个生命周期,release了21次,上次release是2012年
  3. Log4j 2不是log4j 1的下一个版本,是一个完全重写的项目
  4. 作者们都在开发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测试项目
  1. 引入log4j 1的依赖
dependencies {
    testCompile 'log4j:log4j:1.2.17'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
  1. 在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>
  1. 新建测试类,使用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");
    }
}
  1. 运行测试类,因为我们使用的是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");
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值