日志体系-发展历程
简述Java日志体系
JAVA日志体系发展
-
LOG4J:JDK中没有日志概念,仅有System.err与System.ou等流。所以Gülcü与2001年发布了LOG4J,成为apache顶级项目。创造出的logger,appender,level概念影响至今。
2..JUL:sun在jdk1.4中借鉴了LOG4J提出了JUL,但是性能,易用性都不如果LOG4J,在JDK1.5中得到了修复。 - JCL:Apache基金会提出的门面模式,在内部使用适配器模式将LOG4J与JUL使用门面模式给出统一的对外接口。从而使开发者在使用的时候使用上层统一API,底层想用哪个实现就将对应的jar包放到classPath
- Logback:Gülcü提高性能创建的新版本的门面与实现。并且SLF4J提供了上层接口,用户可根据配置使用具体实现。
- SLF4J:Gülcü提高性能为LOG4J创建的升级版本。分为三个模块:
- logback-core:核心模块,后两个模块的基础
- logback-classic:log4j改良版本,并且完整实现SLF4J,能够自如切换log4j与JUL
- logback-access:Servlet容器继承,提供通过Http来访问日志的功能(远程)
- log4j2:因为SLF4J与logback出现,log4j也参照了提出了第二版log4j,与第一版本不兼容,参照SLf4j分为实现与接口,log4j-api&log4j-core。
- 时间表
日志名称 | 出现时间 | 出现原因 |
---|---|---|
LOG4J | 20001 | JDK1.3中指引控制台输出流 |
JUL | JDK1.4 | JDK1.4中参考log4j实现 |
JCL | 统一jul与log4j | |
SLF4J | 更友好的门面 | |
logback | 与Slf4j一同出现 | 更好地实现 |
log4j2 | 不甘于被统一 | 实现log4j-api与log4j-core |
Java日志体系中的桥接图
1. 想象当存在老系统已经使用jcl,.实现层面使用了log4j,现在我想将我的日志系统替换为更好的logback/slf4j。
2. 此时显然由于代码已经按照JCL的接口使用,我需要对JCL的实现不在走log4j这条线。而需要换成jcl-over-slf4j这种底层使用slf4j接口。所以使用适配器模式引入slf4j与jcl的适配器jar包
3. 最后引入logback作为slf4j的实现即可
门面模式
- 含义:也叫外观模式,要求一个子系统的外部与其内部通信必须通过一个统一的对象进行通信。简单说无论内部系统多么复杂,仅提供给调用者一个指定对象与制定API(摘自设计模式之禅)
- 例子:本文中统一了Log4j与JUL的JCL,它提供了统一的接口与统一的使用方式。而内部是使用Log4j与JUL对于客户端用户是无法了解,也屏蔽了内部复杂度