秒懂log4j1与log4j2的区别

本文详述了log4j1与log4j2之间的设计理念差异、依赖引入、类包结构和配置文件变化。log4j2凭借SLF4J风格设计,兼容多种日志系统,是Apache对传统log4j的革新升级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信很多程序猿朋友对log4j都很熟悉,随着技术的发展,log4j的结构、性能被很多新的日志框架所替代。在设计结构上比不上slf4j,在性能上比不上logback。于是apache对垂垂老矣的log4j进行一次重生,不是优化。虽然都叫log4j但是,他们是两个完全不同的东西,为了方便区分他们,给了两个别名:log4j1、log4j2。

log4j1、log4j2区别:

1、设计理念的区别
slf4j的成功在于他的高屋建瓴,俯视一切。slf4j是日志门面(像:java的接口,没有提供任何实现),通过提供各种桥接器,适配各种日志框架(log4j1,logback等)。log4j1并没有这样的高度,于是log4j2就借鉴了slf4j的设计,log4f2有两部分组成:log4j-api、log4j-core。log4j-api和slf4j是相同的,都是日志门面,log4j-core是对log4j-api的实现,和log4j1、logback是相同的, 并且通过桥接器log4j-api还可以适配其他的日志系统(logback等)。这样log4j2就成了一个文堪比slf4,武可斗logback的双优生。

2、log4j1、log4j2 引入jar包的区别:

//log4j1:
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

//log4j2:
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.14.1</version>
</dependency>
//log4j-core包中已经引入了log4j-api
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.14.1</version>
</dependency>

3、log4j1、log4j2中类的包名的区别:

log4j1中类的包名都是以 org.apache.log4j 开头
log4j2中,log4j-api中的类包名以 org.apache.logging.log4j 开头,log4j-core中的类包名以 org.apache.logging.log4j.core 开头。


4、log4j1、log4j2 配置文件类型、文件名称的区别:
log4j1是通过一个.properties的文件作为主配置文件的 
log4j.properties文件:

log4j.rootLogger=DEBUG,console
# 输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 设置输出样式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 日志输出信息格式为
log4j.appender.console.layout.ConversionPattern=[I am log4j_1.x] [%-d{yyyy-MM-dd HH:mm:ss}]-%5p : %m%n


log4j2则已经弃用了.properties方式,采用的是.xml,.json或者.jsn这种方式来做。
log4j2.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[I am log4j_2.x] [%-d{yyyy-MM-dd HH:mm:ss}]-%5p : %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>


测试用例:

public class Log4jTest {
    public static void main(String[] args) {
        org.apache.log4j.Logger log4j1 = org.apache.log4j.LogManager.getLogger(Log4jTest.class);
        log4j1.info("log4j1日志" + log4j1.getClass().getName());

        org.apache.logging.log4j.Logger log4j2 = org.apache.logging.log4j.LogManager.getLogger(Log4jTest.class);
        log4j2.info("log4j2日志" + log4j2.getClass().getName());
    }
}

结果:


 

### Log4j1Log4j2的主要区别 #### 构建模块的不同 对于构建模块而言,`log4j1`仅有一个核心组件即`log4j1`本身;而`log4j2`则由多个部分构成,通常至少需引入两个JAR文件:`log4j-core`用于处理日志逻辑以及`log4j-api`提供API接口[^1]。 #### 设计理念上的改进 相较于前代产品,`log4j2`吸收了诸如SLF4J这类优秀框架的设计思路,在架构层面进行了革新。具体来说,它包含了两大部分——`log4j-api`作为抽象层类似于其他日志门面工具的功能角色,而`log4j-core`负责具体的实现工作。这种分离使得`log4j2`不仅能够兼容更多类型的日志记录需求,还支持其他日志系统的互操作性,比如通过特定桥梁可以对接像Logback这样的第三方解决方案[^2]。 #### 配置方式的变化 在配置方面也存在显著差异。`log4j1`主要依赖`.properties`格式的配置文档来定义全局参数输出设置等信息;相反地,`log4j2`倾向于采用更灵活多样的配置形式,虽然依旧保留了对传统属性文件的支持,但同时也增加了XML、JSON等多种现代数据交换格式的选择余地[^3]。 ```xml <!-- Example of a simple XML configuration file for Log4j2 --> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` #### 迁移路径的存在 当考虑从旧版本迁移到新版本时,有两种可行方案可供选择:一种是在不改变现有应用程序源码的前提下直接替换底层的日志库为`log4j2`并调整相应配置;另一种更为彻底的方式则是逐步过渡至基于`log4j2-API`的新编码风格下开发新的功能特性或者重构既有业务逻辑[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值