前言

几乎每个大型应用程序都包含自己的日志或跟踪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,consolelog4j.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},输出类似:2002年10月18日 22:10:28,921
%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());}
}

输出结果为:

Log4j(四)——Log4j1与Log4j2的区别相关推荐

  1. Java Log4j和Log4j2的区别

    Java Log4j和Log4j2的区别 一.核心JAR包 log4j核心包:log4j:log4j:[version] 而log4j2的核心包有2个: org.apache.logging.log4 ...

  2. java log4j2_老生常谈Log4j和Log4j2的区别(推荐)

    相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程.我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代. log4j是Apache的 ...

  3. log4j平稳升级到log4j2

    一.前言 公司中的项目虽然已经用了很多的新技术了,但是日志的底层框架还是log4j,个人还是不喜欢用这个的.最近项目再生产环境上由于log4j引起了一场血案,于是决定升级到log4j2. 二.现象 虽 ...

  4. 常见日志框架介绍和对比(log4j,logback,log4j2)

    文章目录 1. 什么是slf4j? 2. log4j简介和配置 2.1 log4j介绍 2.2 log4j三大组件 2.3 log4j pom依赖引入 2.4 配置log4j 3. logback简介 ...

  5. slf4j、jcl、jul、log4j1、log4j2、logback大总结

    2019独角兽企业重金招聘Python工程师标准>>> #1 系列目录# 2种日志接口框架,4种日志实现框架 jdk-logging.log4j.logback日志介绍及原理 jcl ...

  6. log4j1升级log4j2

    删除log4j-1.x.jar,然后增加log4j2.x的三个jar包:log4j-api-2.12.1.jar和log4j-core-2.12.1.jar和一个中间桥接包log4j-1.2-api- ...

  7. 四种DCOM错误的区别,0x80080005 0x800706be 0x80010105 0x

    四种DCOM错误的区别 Differences between the following DCOM error 0x80080005 0x800706be 0x80010105 0x800706ba ...

  8. TCP三次握手四次挥手 TCP/UDP区别

    三次握手 第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认:  SYN:同步序列编号(Synchronize Sequence Numbe ...

  9. C++的四种cast操作符的区别--类型转换

    C++的四种cast操作符的区别 发信站: 水木社区 (Thu Jan 26 21:15:16 2006), 站内 声明 by NetMD: 并非我的原创,来自互联网,且是两篇帖子的合集,个人觉得这样 ...

最新文章

  1. C# 窗体最小化的托盘/系统通知区域(转)
  2. C语言斐波那契数列(附完整源码)
  3. spring mvc 教程_Spring MVC开发–快速教程
  4. 真香!腾讯再发阳光普照奖:每人100股,价值超6万!
  5. Leetcode PHP题解--D56 637. Average of Levels in Binary Tree
  6. latex 行内公式
  7. MASM6.11安装
  8. PhotoShop软件笔记
  9. android fragmentmanager 界面报错,FragmentManager is already executing transactions异常
  10. 21点游戏A计算方法
  11. 数据库系统概论-第三章 关系数据库标准语言 SQL
  12. 网页404是不是服务器没开,无法打开的网页出现404错误 知道什么意思吗?
  13. 怎样清除手机上的微信小程序的缓存?
  14. 本科计算机知识点,2018年电大本科计算机网考操作题题库重要知识点(6页)-原创力文档...
  15. 打印数字矩形 (python)
  16. 搭建自己的云存储空间|FastDFS分布式文件系统考虑一下?
  17. get_dummies函数介绍
  18. java中BufferedInputStream缓存为什么使IO效率高?
  19. Geogebra之弧线的绘制
  20. 苹果售出20亿部iPhone:占智能手机总用户26%

热门文章

  1. 论中国未来农业的发展
  2. 科技对农业发展有哪些影响?农业科技的发展展望
  3. 快上车,这才是领导想要的集团管理驾驶舱
  4. linux 命令传文件大小,Linux必学的60个命令(6)-其他
  5. 建站常见的问题(新手必看)
  6. 「日志」测试显卡 TFLOPS
  7. 文本文件和二进制文件学习
  8. 杭电-2035(人见人爱A^B)
  9. openstack windows虚拟机声卡问题
  10. R语言多层桑基图_ceRNA关系网络冲击图—桑基图(R语言绘制)