日志框架为什么会冲突

日志框架为什么会冲突

现场遇到过好几次,放在tomcat的web项目启动后没有logs日志,最终发现都是因为引入的日志框架的jar包冲突导致的,排除不需要的日志框架jar包后log打印正常。

那么为什么同时存在多个日志框架的时候就会出现冲突呢?深入研究了日志框架的历史和设计后,发现原来这跟日志框架的实现机制有关系。

本文主要参考为什么日志框架会冲突

日志框架的历史

首先要从日志框架的发展历史开始说起。

  1. Java Util Log
    首先登场的是Java Util Log,简称JUL,是JDK中自带的log功能。虽然是官方自带的,JUL的使用却不广泛,主要是因为功能比较简单,不好用。

  2. Log4j 1.x
    然后Log4j 1.x就登场了,它是Gülcü 设计实现的日志框架,设计非常优秀,是使用非常广泛的框架。

  3. Commons Logging
    Commons Logging,简称JCL,是Apache的项目,JCL是一个Log Facade,只提供Log API,不提供实现,用Adapter来使用Log4j或者JUL作为Log Implementation。目的是统一日志接口规范,适配多种日志实现。

  4. SLF4J/Logback
    SLF4J(The Simple Logging Facade for Java) 和 Logback 也是 Gülcü 创立的项目,其创立主要是为了提供更高性能的实现。其中,SLF4J是类似于JCL的Log Facade,Logback是类似于Log4j的Log Implementation。这老哥觉得JCL的接口设计不好,所以重新设计了一套。

  5. Log4J2
    维护Log4j的人为了不让Log4j的用户被SLF4J/Logback抢走,所以搞了新的日志框架。Log4j2和Log4j1.x并不兼容,设计上很大程度上模仿了SLF4J/Logback,性能上也获得了很大的提升。Log4j2也做了Facade/Implementation分离设计,分成了Log4j-api和Log4j-core。

至此,我们已经有了3个Log接口和4个Log实现,果然程序员真的是爱造轮子。出现这么多框架之后,有人开始搞各个框架之间的桥接,你兼容我,我兼容你,如下图所示
日志框架兼容图片

因为很多jar使用的日志框架不同,所以经常会出现引入jar包之后导致日志类冲突。

动态加载日志实现

前面我们提到,日志框架分为日志接口和日志实现,只要我们的代码中使用的是日志接口(JCL,SLF4J,Log4j-api),我们可以随时替换日志实现。

SLF4J加载日志实现的方式

SLF4J加载日志实现分为两个步骤:

  1. 获取ILoggerFactory日志工厂,
  2. 根据ILoggerFactory获取Logger。
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信