JAVA日志发展史,终于了解了...
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
- 第一阶段 -
2001年以前,Java是没有日志库的,打印日志全凭System.out和System.err
缺点:
产生大量的IO操作同时在生产环境中无法合理的控制是否需要输出
输出的内容不能保存到文件
只打印在控制台,打印完就过去了,也就是说除非你一直盯着程序跑
无法定制化,且日志粒度不够细
- 第二阶段 -
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干货!