首页 > 编程语言 >JAVA日志发展史,你知道多少?

JAVA日志发展史,你知道多少?

时间:2023-02-21 16:22:37浏览次数:42  
标签:Ceki 发展史 JAVA log4j Slf4j Apache 日志 Log4j

第一阶段
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 的性能提升很大,而且支持异步日志打印。增加很多新的特性。

默认情况下SpringBoot会使用Logback来实现日志管理。

标签:Ceki,发展史,JAVA,log4j,Slf4j,Apache,日志,Log4j
From: https://www.cnblogs.com/zouhong/p/17141435.html

相关文章

  • Java零基础自学容易吗?看我们的学习技巧
    Java零基础自学容易吗?难度是不是很大呢?其实市面上还是有不少自学者的,在最开始的时候确实很难,毕竟大家是刚刚接触这个领域,入门时会看到听到很多奇奇怪怪的名词,当时大家的......
  • Java特性和优势
    简单性面向对象可移植性高性能分布式动态性多线程安全性健壮性......
  • Java三大版本
    WriteOnce、RunAnywhereJavaSE:标准版(桌面程序,控制台开发......JavaME:嵌入式开发(手机,小家电.......JavaEE:E企业级开发(web端,服务器开发...)......
  • 来一波骚操作,Java内存模型
    文章整理自博学谷狂野架构师什么是JMM并发编程领域的关键问题线程之间的通信线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享......
  • tomcat java进程占用CPU资源过高
    top-Hppid-->根据jps得到的进程号(pid),查看java进程的所有线程,并且可以看到所有线程占用CPU的情况,-H用于显示某个进程的所有线程。printf"%x\n"9733-->将第2步查......
  • JavaScript 中字符串和数组的截取办法总结
    字符串substring形式:substring(index1,index2)不会改变原始字符串将小的参数作为开始位置start,大的作为结束位置stop包含start,但不包含stop如果只给一个参数表......
  • 关于Java锁机制的理解
    首先Java中为什么会使用锁:是为了解决Java共享内存模型带来的线程安全问题。思考:两个线程都有初始值为0的静态变量做自增,一个做自减,各做5000次,counter的值会为0嘛?public......
  • 使用java.util.Timer实现定时任务,详解Thread.sleep() in a loop, probably busy-waiti
    很多时候,我们需要定时任务实现一些诸如刷新,心跳,保活等功能。这些定时任务往往逻辑很简单,使用定时任务的框架(例如springboot@Scheduled)往往大材小用。下面是一个定时任......
  • 测试平台系列(3) 给Hello World添加日志
    给HelloWorld添加日志回顾通过上篇内容,我们已经使用Flask完成了我们的第一个接口。我们可以看到,使用Flask来编写接口是十分简单的。那么接下来,我们丰富一下上面的例子......
  • java只有值传递
    Java中将实参传递给方法(或函数)的方式是值传递:如果参数是基本类型的话,很简单,传递的就是基本类型的字面量值的拷贝,会创建副本。如果参数是引用类型,传递的就是实参所引......