Java日志框架总结

转载自:https://www.cnblogs.com/xiaobingblog/p/11502976.html
StackOverFlow异常分析我尚未遇到过,不过做为参考也引用过来,感谢原做者的整理。html

1 基本日志框架之间关系

Java日志框架总结

  • 接口层:SELF4J,COMMONS-LOGGING
  • 实现层:LOG4J,LOGBACK,JDK-LOOGING,LOG4J2

  以上为通用的日志框架实现(即实现)和门面(即接口)。日志门面的出现很大程度缓解了日志系统的混乱,不少库的做者不在使用具体的日志框架实现了,而是去使用接口层,即面向接口编程。此处,贴一段话,方面更能理解。
  应用程序直接使用这些具体日志框架的API来知足日志输出需求固然是能够的,可是因为各个日志框架之间的API一般是不兼容的,这样作就使得应用程序丧失了更换日志框架的灵活性。比直接使用具体日志框架API更合理的选择是使用日志门面接口。日志门面接口提供了一套独立于具体日志框架实现的API,应用程序经过使用这些独立的API就可以实现与具体日志框架的解耦,这跟JDBC是相似的。最先的日志门面接口是commons-logging,但目前最受欢迎的是slf4j。日志门面接口自己一般并无实际的日志输出能力,它底层仍是须要去调用具体的日志框架API的,也就是实际上它须要跟具体的日志框架结合使用。因为具体日志框架比较多,并且互相也大都不兼容,日志门面接口要想实现与任意日志框架结合可能须要对应的桥接器,就好像JDBC与各类不一样的数据库之间的结合须要对应的JDBC驱动同样。数据库

2 StackOverFlow异常分析

Java日志框架总结

上图来自SLF4J官网。如图,上层都是使用SLF4JAPI对外暴露接口。SLF4JAPI使用的是slf4j-api.jar包。接着下层各个日志框架的实现就不同了,最左边的是slf4j的一个空实现。第二列和第五列是logback和slf4j的一个简单实现,这2个框架没有使用所谓的桥接器,直接继承slf4j,实现slf4j的接口。log4j和jul的实现是要依靠桥接器,如上,slf4j-log412.jar和slf4j-jdk14.jar就是桥接器,分别链接slf4j,log4j和slf4j,jul。下面的log4j.jar和JVM runtime即是具体实现。编程

  其余日志系统转掉回slf4j,若是只存在slf-4j转到日志系统实现类,便不会存在StackOverFlow的异常。若是咱们使用log4j日志系统,但又想使用别的日志系统,此时就要使用从日志系统到slf4j的桥接类 log4j-over-slf4j,这个库定义了与log4j一致的接口(包名、类名、方法签名均一致),可是接口的实现倒是对slf4j日志接口的包装,即间接调用了slf4j日志接口,实现了对日志的转发。api

  既然存在这么多桥接器,万一个人系统中存在slf4j -> log4j 和 log4j -> slf4j的桥接器。。。。就会出现互相委托,无限循环,堆栈溢出的情况。全部就会有出现异常。slf4j关于桥接器的详细介绍参考slf4j官方网站:https://www.slf4j.org/legacy.html框架

  好比,我如今想使用slf4j的实现类logback日志框架ide

  1. 引入slf4j & logback日志包和slf4j -> logback桥接器;网站

  2. 排除common-logging、log4j、log4j2日志包;日志

  3. 引入jdk-logging -> slf4j、common-logging -> slf4j、log4j -> slf4j、log4j2 -> slf4j桥接器;htm

  4. 排除slf4j -> jdk-logging、slf4j -> common-logging、slf4j -> log4j、slf4j -> log4j2桥接器。blog

相关文章
相关标签/搜索