JAVA日志发展史,终于了解了...

共 1776字,需浏览 4分钟

 ·

2021-12-17 15:55

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达


-     第一阶段    -

2001年以前,Java是没有日志库的,打印日志全凭System.outSystem.err

缺点:

  1. 产生大量的IO操作同时在生产环境中无法合理的控制是否需要输出

  2. 输出的内容不能保存到文件

  3. 只打印在控制台,打印完就过去了,也就是说除非你一直盯着程序跑

  4. 无法定制化,且日志粒度不够细


-     第二阶段    -

2001年,一个ceki Gulcü的大佬搞了一个日志框架 log4j后来( log4j成为Apache项目,Ceki加入Apache组织
Apache还曾经建议Sun引入Log4j到Java的标准库中,但Sun拒绝了.


-     第三阶段    -

sun有自己的小心思,2002年2月JDK1.4发布,Sun推出了自己的日志标准库JUL(Java Util Logging),其实是照着Log4j抄的,而且还没抄好,还是在JDK1.5以后性能和可用性才有所提升。由于Log4j比JUL好用,并且成熟,所以Log4j在选择上占据了一定的优势。


-     第四阶段    -

2002年8月Apache推出了JCL(Jakarta Commons Logging),也就是日志抽象层,支持运行时动态加载日志组件的实现,当然也提供一个默认实现Simple Log(在 ClassLoader 中进行查找,如果能找到Log4j则默认使用llog4j实现,如果没有则使用JUL实现,再没有则使用JCL内部提供的 Simple Log实现)。

但是JUL有三个缺点:

1.效率较低。
2.容易引发混乱。
3.使用了自定义ClassLoader的程序中,使用JCL会引发内存泄露。


-     第五阶段    -

2006年巨佬Ceki( Log4j的作者)因为一些原因离开了Apache组织,之后Ceki觉得JCL不好用,自己搀了一套新的日志标准接口规范Slf4j (Simple Logging Facacfor Java),也可以称为日志门面,很明显Slf4j是对标JCL,后面也证明了Slf4j比JCL更优秀。
巨佬Ceki提供了一系列的桥接包来帮助Slf4j接口与其他日志库建立关系,这种方式称桥接设计模式。
代码使用Slf4j接口,就可以实现日志的统一标准化,后续如果想要更换日志实现,只需引入Slf4j与相关的桥接包,再引入具体的日志标准库即可。


-     第六阶段    -

Ceki巨佬觉得市场上的日志标准库都是间接实现Slf4j接口,也就是说每次都需要配合桥接包,因此在2006年,Ceki巨佬基于Slf4j接口写出了Logback日志标准库,做为Slf4j接口的默认实现,Logback 也十分给力,在功能完整度和性能上超越了所有已有的日志标准库。

  • 根本原因还在于,随着用户体量的提升,Log4j无法满足高性能的要求,成为应用的性能瓶颈

    目前Java日志体系关系图如下

    • 通过SLF4j桥接到具体的日志框架实现

  • 通过其他日志框架桥接到slf4j


-     第七阶段    -

2012年,Apache直接推出新项目Log4j2(不兼容Log4j) , Log4j2全面借鉴Slf4j+Logback 。
Log4j2不仅仅具有Logback的所有特性,还做了分离设计,分为log4j-api和log4j-core,log4j-api是日志接口,log4j-core是日志标准库,并且Apache也为Log4j2提供了各种桥接包。

而且log4j2 的性能提升很大,而且支持异步日志打印。增加很多新的特性。



  作者 |  一懒众衫小QAQ

来源 |  cnblogs.com/simple-flw/p/15680745.html

加锋哥微信: java1239  
围观锋哥朋友圈,每天推送Java干货!

浏览 57
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报