`
yonglin4605
  • 浏览: 187128 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 日志系统slf4j学习

 
阅读更多
学习了一下JAVA的日志系统slf4j ,这是日志的一个接口。
通过这个接口,我们可以方便的切换日志的实现框架,比如log4j,commons-logging,logback,jdk-log 等等。

slf4j的API在 slf4j-api.jar中,核心接口与类是:
org.slf4j.Logger
org.slf4j.LoggerFactory


slf4j的实际调用日志在运行时才会动态绑定,基本原理是查找classpath下面的jar包,如果存在slf4j的实现框架,就采用该实现框架。参考下图:



下面分析一下slf4j如何实现运行时的动态绑定日志实现框架

以下代码是org.slf4j.LoggerFactory中的部分
  // We need to use the name of the StaticLoggerBinder class, we can't reference
  // the class itseld.
  private static String STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class";

  private static void singleImplementationSanityCheck() {
    try {
      ClassLoader loggerFactoryClassLoader = LoggerFactory.class
          .getClassLoader();
      Enumeration paths;
      if (loggerFactoryClassLoader == null) {
        paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
      } else {
        paths = loggerFactoryClassLoader
            .getResources(STATIC_LOGGER_BINDER_PATH);
      }
      List implementationList = new ArrayList();
      while (paths.hasMoreElements()) {
        URL path = (URL) paths.nextElement();
        implementationList.add(path);
      }
      if (implementationList.size() > 1) {
        Util.report("Class path contains multiple SLF4J bindings.");
        for (int i = 0; i < implementationList.size(); i++) {
          Util.report("Found binding in [" + implementationList.get(i) + "]");
        }
        Util.report("See " + MULTIPLE_BINDINGS_URL + " for an explanation.");
      }
    } catch (IOException ioe) {
      Util.report("Error getting resources from path", ioe);
    }
  }

我们的日志系统lib中有一个日志API:slf4j-api.jar,以及不少于一个日志框架(比如log4j,commons-logging等等)
程序运行过程中到底会使用哪个日志框架(log4j or commons-logging)呢。
这个中间需要一个API -> 实现框架的桥梁: 对接包
上面代码可以看出,通过ClassLoader来查找资源"org/slf4j/impl/StaticLoggerBinder.class",
如果有1个资源,这个就是日志实现库对接包了。如果有多个资源,则警告classpath路径下有多个slf4j的实现框架对接包。
那如果有多个实现框架对接包的情况下,到底会用哪个实现框架呢?这个就靠ClassLoader先加载到哪个了,不能确定。
因此不要在classpath下放入多个slf4j的实现框架对接包,避免出错。


上面说到关键的类StaticLoggerBinder.class,这个是判断采用哪个slf4j实现框架的关键。
StaticLoggerBinder类是slf4j组织来写的,目的是为了对接不同的日志框架。
如上图所示,slf4j-log12-xxx.jar slf4j-jdk14-xxx.jar 之类jar中就包含StaticLoggerBinder类。
实际中至少需要在classpath下提供一个实现框架,以及不多于一个对应的对接包


slf4j还有一个功能是,可以方便的迁移不同的日志框架。
比如一个项目是使用commons-logging框架来写日志的。
我们需要迁移到log4j框架来,如何处理呢。
使用slf4j将会非常方便,我们只需要做三步:
1.删除原有的commons-logging包
2.将log4j的jar加入到classpath
3.引入一个日志转换的jar,在这里是jcl-over-slf4j.jar

下面分析一下以上步骤的实现原理
commons-logging框架中的几个核心类是:
org.apache.commons.logging.Log
org.apache.commons.logging.LoggerFactory
老项目采用了commons-logging框架,必然会耦合这几个类,比如使用了如下代码:
org.apache.commons.logging.Log.error("errror msg");

要想使以上代码正常运行,而又实际是调用log4j来处理。这里就需要用到jcl-over-slf4j.jar了
jcl-over-slf4j.jar实际上是覆写了commons-logging中的几个核心类,内部采用类Adaptor,对接到了slf4j的API上面。
即jcl-over-slf4j中也有 org.apache.commons.logging.Log这个类, 他与原生的类完全不同,仅仅是适配到了slf4j-api上。
因为jcl-over-slf4j.jar是slf4j出品,slf4j把代码写到了不属于他们的package下面,感觉有点山寨,怪怪的。

这里只是举例commons-logging -> log4j, 其他的转换也类似,只是需要下载不同的适配包

整理一下日志框架迁移的流程
老日志框架:类比与上例的common-logging代码
新日志框架:类比与上例的log4j
适配包:类比与上例的jcl-over-slf4j.jar
对接包:类比与上上例的slf4j-log4j12-xxx.jar


老日志框架  ---(适配包)--->  SLF4J API ---(对接包)---> 新日志框架
          







  • 大小: 71.9 KB
分享到:
评论

相关推荐

    Java Slf4j依赖包

    2. `slf4j-jdk14-1.5.6.jar`:这是一个适配器模块,它使得Slf4j可以使用Java内置的日志系统(java.util.logging)作为其后台日志框架。如果你的应用环境中已经使用了Java内置的日志,那么这个适配器可以让Slf4j无缝...

    slf4j完整日志文件

    总结,SLF4J是Java日志管理的重要工具,通过提供统一的API,使得开发者可以在不改变代码的情况下灵活选择或切换日志实现。结合Log4j,我们可以实现强大的日志记录功能,方便调试和监控应用程序。在具体项目中,配置...

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案.docx

    1. 兼容性强:Slf4j可以与多种日志系统集成,如Log4j、Logback、Java Util Logging等。 2. 灵活性强:Slf4j提供了统一的日志接口,使得用户可以选择不同的日志实现。 3. 高性能:Slf4j可以在高并发情况下提供高性能...

    java slf4j

    总之,SLF4J作为Java日志的标准之一,以其简洁的API、强大的功能和高度的灵活性,为开发者提供了高效、便捷的日志处理方案。通过SLF4J,我们可以轻松地在不同的日志框架之间切换,同时保持代码的整洁和一致性。在...

    调试日志之slf4j+logback

    在IT行业中,日志记录是系统调试、故障排查和性能分析的重要工具。本文将深入探讨“调试日志之slf4j+...文档《复件 日志系统.docx》可能包含了更多关于如何配置和使用SLF4J+Logback的详细信息,建议进一步查阅学习。

    log4j-2.11.2的jar包和日志门面slf4j的jar包

    Log4j和SLF4J(Simple Logging Facade for Java)是Java领域广泛使用的两个日志框架,它们有着各自的特点和用途。下面将详细阐述这两个框架以及它们在给定压缩包中的具体组件。 首先,Log4j是Apache软件基金会的一...

    非web工程使用slf4j输出日志

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供一个简单的接口,使得开发者能够在不改变代码的情况下更换日志实现。在非Web工程中,SLF4J同样扮演着...

    log4j + slf4j-api + slf4j-log4j12

    slf4j-log4j12-1.7.x版本是SLF4J针对Log4j 1.2版本的绑定器,它使得应用可以使用SLF4J接口,但实际的日志输出通过Log4j进行。这个桥接器让项目能利用SLF4J的灵活性,同时使用Log4j的成熟实现。 在提供的文件名列表...

    slf4j日志框架的源代码分享

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...

    slf4j jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。这个jar包是SLF4J的核心组件,用于在应用...

    slf4j-api.jar和slf4j-nop.jar打包下载

    总的来说,SLF4J的出现使得Java日志处理更加规范和模块化,开发者可以根据项目的特性选择最适合的日志实现,同时减少了不同日志库之间的代码冲突。通过使用SLF4J,我们可以编写出更加简洁、可维护的代码,提高了项目...

    slf4j-log4j12-1.7.12.jar、slf4j-api-1.7.12.jar

    SLF4J提供了一种机制,通过在类路径中放置特殊的“禁止”JAR(如jul-to-slf4j.jar),可以防止Java Util Logging(JUL)等其他日志框架的直接使用,从而保持日志系统的统一。 标签"slf4j"表明了这两个JAR文件与SLF4...

    slf4j所需要的所有jar文件集合

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架提供了一个统一的API,如Log4j、Java Util Logging、Logback等。这个API允许开发者在部署应用时选择合适的日志实现,而无需修改...

    日志 log4j-slf4j+logback1.3.0

    SLF4J提供了一套简单的API,用于编写日志语句,然后在运行时通过绑定具体的日志实现(如Log4j、Java内置的日志系统等)来决定日志的行为。 Logback则是由Log4j的创始人Ceki Gülcü开发的一个更现代、更高效的日志...

    slf4j最新jar包下载和jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个接口,允许用户在运行时动态地绑定到各种具体的日志框架,如Log4j、Java内置的日志或者Logback等。这个设计使得开发者可以在不修改...

    slf4j-api-1.7.12.jar slf4j-log4j12-1.7.12.jar

    总结来说,SLF4J是一个重要的日志抽象层,它简化了Java日志处理,提高了代码的可维护性和可扩展性。`slf4j-api-1.7.12.jar`和`slf4j-log4j12-1.7.12.jar`分别是SLF4J API和SLF4J到Log4j的绑定,它们共同工作,使...

    Slf4j日志相关jar包

    Slf4j(Simple Logging Facade for Java)是一个用于日志系统的简单 facade,它允许最终用户在部署他们的应用时使用他们希望的日志库。Slf4j提供了一个统一的API,使得开发人员能够在不更换日志实现的情况下,轻松地...

    slf4j与其它日志api的结合

    描述中的"slf4j_and_slf4j_simple.png"可能展示了如何使用SLF4J最基础的功能,而"slf4j_and_slf4j_jdk.png"可能涉及了如何将SLF4J与Java内置日志系统集成。"slf4j_and_slf4j-log4j.png"则可能演示了如何配置SLF4J与...

    浅谈Java日志框架slf4j作用及其实现原理

    SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它的主要目的是为各种日志实现提供一个统一的接口。这使得开发者能够在不修改代码的情况下,自由地选择日志实现,如Log4J、Logback或Java内置...

    slf4j-api-1.7.7,slf4j-log4j12-1.7.7

    SLF4J的出现主要是为了解决Java日志API的碎片化问题,让应用的日志配置更加灵活。 标题中的"slf4j-api-1.7.7"指的是SLF4J API的1.7.7版本,它是SLF4J的核心组件,包含了SLF4J的日志API定义。这个库提供了日志记录的...

Global site tag (gtag.js) - Google Analytics