vlambda博客
学习文章列表

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的核心。

java日志那些事儿-日志野史

        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庞大的用户群,还是吸引了一些流量。

java日志那些事儿-日志野史

        此时的Apache心急如焚,眼看着大把的流量被切走,为了捍卫自己的江湖地位,于2002年8月推出一套interface,Jakarta Commons Logging开始面世,JCL可以让使用者在Log4J和JUL之间来回切换。

java日志那些事儿-日志野史

        JCL面世以后,网友猜测,切基古尔库越来越难以掌控Log4j这个项目,加上Log4j使用不规范导致的一些效能问题,还有一些历史遗留问题难以推动解决,他在2005年离开了Apache,并且自立门户,随即推出了另一款Interface,也就是鼎鼎大名的Simple Logging Facade for Java,Slf4j是一套接口的规范,现在不都讲究面向接口编程嘛。

java日志那些事儿-日志野史

        切基古尔库先拿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。

java日志那些事儿-日志野史

        Slf4j只是一套接口规则,想要胜出,还是要拿出实际的东西来,切基古尔库深谙这个理儿,从2006年开始,他就着手开发一套属于Slf4j自己的实现,自己亲自开发Log4j,对于其不合理和遗留的问题他太熟悉了,第三套实现Logback也顺理成章的出世了,关键功效上比Log4j更胜一筹

java日志那些事儿-日志野史


        Slf4j和Logback大行其道,Apache也不会坐以待毙,既然你想靠一个Slf4j称霸,那我也搞一个东西出来一统江湖,2012年Log4j2终于问世,但是Log4j2也算是Log4j的直接升级版,但这两的架构相差甚远。但Log4j2的分层方式又能看到Logback的影子。

java日志那些事儿-日志野史

        至此,java世界的Log之争暂时先告一段落。

 关于日志选型

        JCL和Slf4j是接口,log4j、log4j2、logback都是实现,日常开发一般会选择接口+实现的方式来作为项目日志的集成方式,网上很多关于log4j2与logback各种性能参数的对比,大都是基于特定的版本,这也从侧面告诉我们,在实际开发过程中,要结合自己项目,在确定jdk或者spring版本的基础上,再去选择对比各日志性能的优劣。

        具体各版本的性能对比,可以参考官方文档,Ceki Gülcü在前一段时间也更新了logback压测项目代码,感兴趣的可以参考https://github.com/ceki/logback-perf

Ceki Gülcü