网站首页 > java教程 正文
今天不聊技术点儿,聊一聊技术背后那些事儿,日志作为我们日常开发中非常重要的一员,每天都会被使用无数次,java日志框架众多,但仔细梳理一下,其实也就那几个。
了解一下各种日志的由来,也能有助于日志的选型,没有最好的,只有最合适的。
追溯时间
日志 | 归属 | 出生时间 |
System.out | java | 1995 |
Log4J | Apache/Ceki Gülcü | 2001 |
JUL(Java Util Logging) | java1.4 | 2002.2 |
JCL(Jakarta Commons Logging) | Apache | 2002.8 |
Slf4j(Simple Logging Facade for Java) | Ceki Gülcü | 2005 |
Logback | Ceki Gülcü | 2006 |
Log4j2 | Apache | 2012 |
纷争开始了
最早大家都用System.out或error来打印日志,但错误严重性有高有低,无法区分。
1996年,一个欧盟赞助的 SEMPER项目打算记录操作API的行为,以便于追溯问题。N. Asokan、Ceki Gülcü 和 Michael Steiner 就提出了分层记录器的想法,这也就是日志级别的由来。
历史总是会留下某个人,然后其他人就没有然后了,哈哈。这个叫切基古尔库的哥们跟他同事一起开发了第一个日志框架Log4j,分层记录的思想是Log4j的核心。
2001年,切基古尔库公开了Log4j,拉开了大战的序幕,Log4j加入Apache,切基古尔库也成为了Apache中的一员,大树下面好乘凉,Log4j迅猛发展。
这时的Java还没有自己的日志系统,Apache盯上了Java,建议Sun把Log4j加入到Java体系中。Sun当然拒绝了,卧榻之侧,岂容他人鼾睡,Sun早就坐不住了,在2002年2月发布了Java1.4,在util加入了自己的Logging,JUL腾空出世,想与Log4J一比高下,奈何JUL功效上稍逊三分,无法干掉Log4j,但是依托java庞大的用户群,还是吸引了一些流量。
此时的Apache心急如焚,眼看着大把的流量被切走,为了捍卫自己的江湖地位,于2002年8月推出一套interface,Jakarta Commons Logging开始面世,JCL可以让使用者在Log4J和JUL之间来回切换。
JCL面世以后,网友猜测,切基古尔库越来越难以掌控Log4j这个项目,加上Log4j使用不规范导致的一些效能问题,还有一些历史遗留问题难以推动解决,他在2005年离开了Apache,并且自立门户,随即推出了另一款Interface,也就是鼎鼎大名的Simple Logging Facade for Java,Slf4j是一套接口的规范,现在不都讲究面向接口编程嘛。
切基古尔库先拿JCL开刀,为了让JCL的使用者方面使用这套Slf4j,他来了个狸猫换太子,开发了jcl-over-slf4j.jar,接着为了方便Log4j的使用者,把Log4j当做Slf4j的实现类,他加了一层适配器,实现了Slf4j-log4j12.jar。
到现在为止,一共有两套接口(JCL和Slf4j),两套实现(Log4j和JUL),为了一统江湖,切基古尔库又开发了log4j-over-slf4j.jar,可以用来替换掉log4j这个实现,进而改为自己的实现。
JUL虽比不过log4j,但是那又怎能放过,2008年的时候,他也在JUL上加了一层适配器,实现了slf4j-jdk14.jar。
Slf4j只是一套接口规则,想要胜出,还是要拿出实际的东西来,切基古尔库深谙这个理儿,从2006年开始,他就着手开发一套属于Slf4j自己的实现,自己亲自开发Log4j,对于其不合理和遗留的问题他太熟悉了,第三套实现Logback也顺理成章的出世了,关键功效上比Log4j更胜一筹
Slf4j和Logback大行其道,Apache也不会坐以待毙,既然你想靠一个Slf4j称霸,那我也搞一个东西出来一统江湖,2012年Log4j2终于问世,但是Log4j2也算是Log4j的直接升级版,但这两的架构相差甚远。但Log4j2的分层方式又能看到Logback的影子。
至此,java世界的Log之争暂时先告一段落。
关于日志选型
JCL和Slf4j是接口,log4j、log4j2、logback都是实现,日常开发一般会选择接口+实现的方式来作为项目日志的集成方式,网上很多关于log4j2与logback各种性能参数的对比,大都是基于特定的版本,这也从侧面告诉我们,在实际开发过程中,要结合自己项目,在确定jdk或者spring版本的基础上,再去选择对比各日志性能的优劣。
具体各版本的性能对比,可以参考官方文档,Ceki Gülcü在前一段时间也更新了logback压测项目代码,感兴趣的可以参考https://github.com/ceki/logback-perf
猜你喜欢
- 2024-11-12 大厂都是如何解决Java日志级别,重复记录、丢日志问题?
- 2024-11-12 五年Java经验,面试还是说不出日志该怎么写更好?
- 2024-11-12 Java常用日志框架总结(java的日志框架)
- 2024-11-12 java日志组件(java 日志系统)
- 2024-11-12 java打日志超简单(java如何输出日志)
- 2024-11-12 Java企业级项目的日志规范(java企业级项目的日志规范有哪些)
- 2024-11-12 小白也能看懂Java 日志体系(SLF4J)
- 2024-11-12 开发须知:开发者须知的4类Java日志
- 2024-11-12 谈谈日志的最佳实践(谈谈日志的最佳实践方式)
- 2024-11-12 4000字长文介绍Java日志中框架,最全面
你 发表评论:
欢迎- 06-15Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 06-15推荐一款超棒的SpringCloud 脚手架项目
- 06-15IDEA将项目打包成jar包(idea打包普通java项目)
- 06-15Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 06-15记录Dockerfile将jar包构建成部署所需的镜像
- 06-15项目基础部署汇总八---linux下xxl-job安装
- 06-15Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 06-15终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 最近发表
-
- Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 推荐一款超棒的SpringCloud 脚手架项目
- IDEA将项目打包成jar包(idea打包普通java项目)
- Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 记录Dockerfile将jar包构建成部署所需的镜像
- 项目基础部署汇总八---linux下xxl-job安装
- Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 如何将本地JAR文件添加到Maven项目中
- Java 类隔离应用:多 Jar 包支持(java接口隔离原则)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)