Log4j(四)——Log4j1与Log4j2的区别

2023-11-09

前言

几乎每个大型应用程序都包含自己的日志或跟踪API。为了符合这一规则,欧盟SEMPRER项目决定编写自己的跟踪API。这是在1996年初。经过无数次的增强、几个版本和大量的工作之后,API演变成了log4j,这是一个流行的Java日志包。这个包是在Apache Software License下发布的,Apache Software License是由开源组织认证的完全成熟的开源许可证。

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

Log4j1与Log4j2的区别

设计理念的区别

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集成了slf4j与logback的优点,成为了Log4j的一次重生。

核心Jar包的区别

上面我们就说了,Log4j有两部分组成,分别是log4j-api、log4j-core

而在Log4j1中,Log4j的核心包只有log4j:log4j:[version]

而log4j2的核心包有2个:

org.apache.logging.log4j:log4j-core:[version]
org.apache.logging.log4j:log4j-api:[version]

引入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>

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

Log4j1中类的包名都是以 org.apache.log4j 开头

Log4j2中,log4j-api中的类包名以 org.apache.logging.log4j 开头,log4j-core中的类包名以 org.apache.logging.log4j.core 开头。

配置文件的区别

Log4j:通过一个log4j.properties的文件作为主配置文件。

以下是一个输出到控制台的例子:

log4j.rootLogger=INFO,console
 
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] [%thread] [%c] >>> %m%n

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:%m 输出代码中指定的消息:

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
%r 输出自应用启动到输出该log信息耗费的毫秒数  
%c 输出所属的类目,通常就是所在类的全名  
%t 输出产生该日志事件的线程名  
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”  
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy 	MMM dd HH:mm:ss,SSS},输出类似:20021018221028921  
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:	Testlog4.main(TestLog4.java:10)

而在Log4j2中,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>

调用方式的区别

Log4j1中

import org.apache.log4j.Logger;
private static final Logger logger = Logger.getLogger(App.class);

而在Log4j2中

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static final Logger logger = LogManager.getLogger(App.class);

测试用例

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());
    }
}

输出结果为:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Log4j(四)——Log4j1与Log4j2的区别 的相关文章

随机推荐

  • Josephus问题,数组和链表(C++实现)

    文章目录 问题 需求分析 ADT定义 关键思路 问题 设有n个人围坐在圆桌周围 现从第s个人开始报数 数到第m的人出列 然后从出列的下一个人重新开始报数 数到第m的人又出列 如此反复直到所有的人全部出列为止 需求分析 n个人坐满一张圆桌 为
  • verilog赋多位值_Verilog重点解析(2)(赋值)

    源自 微信公众号 数字芯片实验室 1 连续赋值和过程赋值之间有什么区别 2 initial和always中的赋值有什么区别 initial和always中的赋值都是过程赋值 3 阻塞和非阻塞赋值之间有什么区别 阻塞和非阻塞赋值都是过程赋值
  • Zabbix监控Windows客户端设置

    Zabbix监控Windows客户端设置 一 Windows被控端安装 1 Windows代理下载 2 安装代理 二 检查被控端状态 1 查看端口 2 检查代理服务 3 服务端查看获取被控信息 三 Web端添加被控主机 1 添加主机信息 2
  • [1078]Win10配置Java环境变量

    文章目录 1 下载安装JDK 2 配置环境变量 2 1 找到jdk的安装目录 2 2 添加环境变量 2 3 测试 1 下载安装JDK 下载地址 安装就不赘述了 2 配置环境变量 2 1 找到jdk的安装目录 win e打开资源管理器 找到j
  • 手势控制arduino-wifi小车(含代码)

    手势控制器 小车完成图 贴代码 手势控制器代码 include
  • 使用VHDL语言控制相机

    将CMOS相机与ZYNQ 7000系列FPGA SoC连接 并将实时视频输入输出到VGA屏幕 硬件 软件 概述 在这个项目中 我们将从头开始构建一个FPGA映像平台 目的是将VGA分辨率CMOS相机与MiniZed Development板
  • 计算机超频的好处与坏处,CPU超频有什么坏处,到底会不会有副作用?

    超频是指提高计算机某一部件工作频率而使之工作在非标准频率下的行为及相关行动都应该称之为超频 其中包括CPU超频 主板超频 内存超频 显示卡超频和硬盘超频等等很多部分 一方面 超频可以使系统性能提升 并且提升产品的实用价值 但是对于大多数人仍
  • 图文详解微信小程序如何实现微信授权登录(Java后台)上

    详解微信小程序如何实现微信授权登录 Java后台 springboot框架 附关键源码 jar包依赖
  • STM32HAL 移植 cJSON开源库 (裸机开发神器)

    目录 概述 一 使用方法 二 STM32CubeMx配置 三 Examples 四 运行结果 五 总结 概述 本篇文章介绍如何使用STM32引用 cJSON开源库 JSON格式在互联网数据交互时常用的一个格式 现嵌入式物联网方向 经常使用到
  • php redis消息订阅与发布_PHP实现redis订阅和发布(用于异步任务处理)

    搜索热词 1 概念 名称及含义 channel频道 生产者和消费者直接操作的对象 publish生产者 向channel发送消息 subscribe消费者 订阅一个或多个channel psubscribe消费者 匹配订阅一个或多个chan
  • STM32输出2路PWM-------------------------------major

    major PWM输出 TIM2 TIM3 TIM4 定时器有四个独立通道 可以独立产生PWM 使用的芯片必须是100脚或144才有重映射功能 无重映射功能则使用默认的引脚即可 测试使用TIM3 1 初始化时钟 2 初始化GPIO 3 初始
  • 全国计算机等级考试题库二级C操作题100套(第87套)

    第87套 函数fun的功能是 统计长整数n的各个位上出现数字1 2 3的次数 并通过外部 全局 变量c1 c2 c3返回主函数 例如 当n 123114350时 结果应该为 c1 3 c2 1 c3 2 请在程序的下划线处填入正确的内容并把
  • 2021-11-09 indy使用,局域网发送文件的源代码(idUDPserver,idUDPClient)

    indy使用 局域网发送文件的源代码 idUDPserver idUDPClient 服务端 unit Unit1 interface uses Windows Messages SysUtils Variants Classes Grap
  • 外网测试telnet&SSH漏洞案例分析

    I 问题现象 我司通讯管理机产品 现场要连接外网 安全测试中发现以下问题 II 问题分析 我司通讯管理机产品开通了telnet 以及SSH服务 主要用来远程调试 问题分析 1 Unencrypted Telnet Server Telnet
  • 使用lev00生成电荷密度等高图

    以graphene为例 INCAR SYSTEM graphene ISTART 0 ICHARG 2 Startparameter for this run PREC A Electronic Relaxation ENCUT 500 N
  • 两两配对问题

    1 两两配对差值最小 题目描述 给定一个长度为偶数的数组arr 将该数组中的数字两两配对并求和 在这些和中选出最大和最小值 请问该如何两两配对 才能让最大值和最小值的差值最小 分析 主要是利用了c 里面对数组的一个排序函数sort 数组名
  • 【python】pip与conda的区别

    pip pip只能用来管理包 pip install能在任何环境中安装python包 也仅限python包 conda 现在听说只能通过anaconda和miniconda来安装 待科普 安装后可以使用conda来创建虚拟环境和管理包 关于
  • OVP过压保护IC高耐压36V,首选钰泰ETA7008/ETA7014

    深圳市展嵘电子有限公司有需要的上帝可联系小陈 136 6225 3950 3412 1522 98产品描述 ETA7008是一颗非常适合用于无线充和移动电源的高耐压保护IC 性价比非常好 有很大程度防止移动电源容易过压烧毁的可能 ETA70
  • [react基础]关于v6版本route的变化,以及常见应用模式

    该说不说 在做这些之前 你要记得一件事 route不是react或者vue等原本就有的组件 需要你手动下载 然后导入 原本的框架只是最终挂载到一个html界面上 别再问我为啥你扒下来的代码为啥不好使了 讨厌 gt lt 下载指令去看我另一篇
  • Log4j(四)——Log4j1与Log4j2的区别

    前言 几乎每个大型应用程序都包含自己的日志或跟踪API 为了符合这一规则 欧盟SEMPRER项目决定编写自己的跟踪API 这是在1996年初 经过无数次的增强 几个版本和大量的工作之后 API演变成了log4j 这是一个流行的Java日志包