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
Ceki Gülcü