`
yonglin4605
  • 浏览: 183402 次
  • 性别: 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
分享到:
评论

相关推荐

    slf4j完整日志文件

    基于slf4j的完整资源

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

    日志记录是应用程序运行中必不可少的一部分。这篇文章主要介绍了浅谈Java日志框架slf4j作用及其实现原理,SLF4J是一个日志框架抽象层,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    slf4j-Logging

    slf4j:Simple Logging Facade for Java,为java提供的简单日志Facade。Facade:门面,更底层一点说就是接口。他允许用户以自己的喜好,在工程中通过slf4j接入不同的日志系统。更直观一点,slf4j是个数据线,一端...

    非web工程使用slf4j输出日志

    非web工程使用slf4j输出日志 非web工程使用slf4j输出日志 非web工程使用slf4j输出日志

    java高级处理日志工具org.slf4j.jar

    java高级处理日志工具org.slf4j.jar,可以和org.slf4j.log4j结合起来使用

    slf4j 1.6.4

    SLF4J不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。 实际上,SLF4J所提供的核心API是一些...

    java高级处理日志工具org.slf4j.log4j.jar,可以和org.slf4j.jar结合起来使用

    java高级处理日志工具org.slf4j.log4j.jar,可以和org.slf4j.jar结合起来使用

    Slf4j日志相关jar包

    Slf4j日志相关jar包 包含log4j Slf4j jboss-logging commons-logging

    slf4j-gao.rar

    分享我写的彩色控制台日志组件-基于slf4j-simple改造。 有颜色、最简单/全面的log内容、最佳的性能,能够定制所有的内容,所以我写了一个彩色控制台log的java组件。 原创不易多多支持。

    java日志插件 slf4j-api-1.7.32.jar,logback

    slf4j-api-1.7.32.jar,logback

    调试日志之slf4j+logback

    NULL 博文链接:https://xiayingjie.iteye.com/blog/828498

    slf4j-api-1.7.2.jar

    Simple Logging Facade for Java (SLF4J) The Simple Logging ...Java的简单日志外观(SLF4J)作为各种日志框架(例如JavaUTIL日志记录、LogCub、Log4J)的简单外观或抽象,允许终端用户在部署时插入所需的日志框架。

    Loger_slf4j写入数据表Demo

    slf4j日志级别有五种:ERROR、WARN、INFO、DEBUG、TRACE,级别从高到底 其示例中取warn级别及写入数据库配置:database 三、配置文件db.properties、log4j.properties两个配置文件可以通过servlet配置来使用,也...

    java的log4j、slf4j的jar包

    日志记录文件,使用log4j,和slf4j。这种联合使用的方式,提供log4j的jar包、log4j-over-slf4j的jar包,slf4j-api的jar包,以及log4j.properties文件。

    slf4j输入日志到mongodb

    演示了java中怎样使用slf4j把日志记录到mongodb中

    slf4j-1.4.3 log日志包

    slf4j-1.4.3 java开源log日志包

    slf4j-1.7.17

    为什么使用 SLF4J 而不是 Log4J 来做 Java 日志

    slf4j与其它日志api的结合

    关于日志的一些小例子,包括slf4j, log4j等

    slf4j+logback日志系统介绍

    SLF4J(Simple Logging Facade for Java)作为commons-logging的替代,为各种logging APIs提供了一个简单的统一接口,使得最终用户能够在部署的时候配置所希望的logging APIs的实现。

    SpringBoot日志插件log4J和slf4J的使用和比较含完整示例

    Log4j 和 Slf4j 都是广泛使用的 Java 日志框架,各有其优缺点。在选择时,建议根据项目的具体需求和场景来权衡。如果需要一个完整的日志解决方案并且对性能和资源占用不太敏感,Log4j 可能是一个不错的选择。如果更...

Global site tag (gtag.js) - Google Analytics