zoukankan      html  css  js  c++  java
  • SLF4J

    slf4j全称:Simple Logging Facade for Java简单日志门面(Facade)

         SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。Logging API实现既可以选择直接实现SLF4J接口的loging APIs如: logback、SimpleLogger。也可以通过开发相应的适配器来使用已有的API实现如Log4jLoggerAdapter、JDK14LoggerAdapter。
        SLF4J 不依赖任何特殊的class loader机制,实际上,SLF4J 和已有日志实现的绑定是在编译时静态执行的,具体绑定工作是通过一个jar包实现的,使用时只要把相应的jar包(只有一个)放到类路径上即可。

        在 SLF4J发行版本中包含了几个jar包,如slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-log4j13.jar, slf4j-jdk14.jar and slf4j-jcl.jar等.SLF4J支持多个日志系统,比如NOP, Simple, log4j version 1.2, log4j version 1.3, JDK 1.4 logging, JCL and logback。

        使用slf4j尽管很方便,但是让很多人搞不明白slf4j那么多包怎么用。其实slf4j原理很简单,他只提供一个核心slf4j api(就是slf4j-api.jar包),这个包只有日志的接口,并没有实现,所以如果要使用就得再给它提供一个实现了些接口的日志包,比 如:log4j,common logging,jdk log日志实现包等,但是这些日志实现又不能通过接口直接调用,实现上他们根本就和slf4j-api不一致,因此slf4j又增加了一层来转换各日志实 现包的使用,当然slf4j-simple除外。其结构如下:

    slf4j-api(接口层)
    |
    各日志实现包的连接层( slf4j-jdk14, slf4j-log4j)
    |
    各日志实现包

    下面这个图更能说明其原理:

    在这里还需要注意的是,连接层的jar包和实现的jar的版本要一致。
    附jar说明:
    slf4j-api-1.6.1.jar             --> slf4j核心接口包
    slf4j-simple-1.6.1.jar        --> slf4j Simple Logger日志实现包
    slf4j-nop-1.6.1.jar            -->
    slf4j-migrator-1.6.1.jar     -->
    slf4j-log4j12-1.6.1.jar      --> slf4j调用log4j的实现包
    slf4j-jdk14-1.6.1.jar         --> slf4j调用jdk java.util.logging的实现包
    slf4j-jcl-1.6.1.jar               --> Jakarta Commons Logging
    slf4j-ext-1.6.1.jar             -->
    log4j-over-slf4j-1.6.1.jar  -->
    jul-to-slf4j-1.6.1.jar         -->
    jcl-over-slf4j-1.6.1.jar      -->

    slf4j+log4j组合使用模式:
    1. slf4j-api-1.5.11.jar
    2. slf4j-log4j12-1.5.11.jar
    3. log4j-1.2.15.jar
    4. log4j.properties(也可以是 log4j.xml,本例中用 log4j.propertes)

    JCL+Log4J组合使用模式:
    1. commons-logging-1.1.jar
    2. log4j-1.2.15.jar
    3. log4j.properties

    把这种 SLF4J+Log4J 的使用模式与曾为霸主地位的 JCL+Log4J 的用法进行一下对比(请忽略掉包文件中的版本号):

    SLF4J+Log4j 组合对比JCL+Log4J 组合slf4j-api-1.5.11.jar相当,定义高层 APIcommons-logging-1.1.jarslf4j-log4j12-1.5.11.jar相当,左边是用绑定包,右边
    是用配置文件来指定日志实现commons-logging.properties,内容为:
    org.apache.commons.logging.LogFactory=
    org.apache.commons.logging.impl.LogFactoryImpl
    或者
    org.apache.commons.logging.Log=
    org.apache.commons.logging.impl.Log4JLoggerlog4j-1.2.15.jar一样log4j-1.2.15.jarlog4j.properties一样,原来怎么配置现在也是log4j.properties程序代码中:
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    Logger logger = LoggerFactory.getLogger(TestSlf4j.class);
    logger.info("Hello {}","SLF4J");左边侵入的是 SLF4J API,右边是被 JCL 的 API 污染了

    SLF4J 支持参数化,而 JCL 不能程序代码中:
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    Log log = LogFactory.getLog(TestJCL.class);

    log.info("Hello JCL");

    从上面的对比来看,SLF4j+Log4j 与 JCL+Log4J 的使用方式差不多,主要差异就在 SLF4J 用 jar 来告知用哪种日志实现,而 JCL 是通过配置文件来获得该选择哪个日志实现。

        为 什么会兴起 SLF4J,看看我们原来哪一个框架中,大的如 SSH 三雄(Spring、Struts、Hibernate),还有 WAS 应用服务器,小的就不计其数以前用的通用日志框架都清一色的 Jakarta Commons Logging(JCL),日志实现会选用 Log4j,为何现在 Hibernate、Tapesty、DbUnit、Jetty V6 等纷纷变节,都采用了 SLF4J 了呢?SLF4J 与 JCL 相比,定然是有其可表之处。而其中 SLF4J 受类加载器的影响较小,不易产生内存溢出的问题,性能得到了改善,更主要是顺应了潮流的发展--可方便部署到 OSGI 环境中。
    如何使用slf4j
    下边一段程序是经典的使用slf4j的方法.

     1  import  org.slf4j.Logger;
     2  import  org.slf4j.LoggerFactory;
     3  public   class  Wombat  {
     4       final  Logger logger  =  LoggerFactory.getLogger(Wombat. class );
     5      Integer t;
     6      Integer oldT;
     7       public   void  setTemperature(Integer temperature)  {
     8          oldT  =  t;
     9          t  =  temperature;
    10          logger.error( " Temperature set to {}. Old temperature was {}. " , t, oldT);
    11           if  (temperature.intValue()  >   50 )  {
    12              logger.info( " Temperature has risen above 50 degrees. " );
    13          } 
    14      } 
    15       public   static   void  main(String[] args)  {
    16          Wombat wombat  =   new  Wombat();
    17          wombat.setTemperature( 1 );
    18          wombat.setTemperature( 55 );
    19      } 
    20  }
    View Code

    下边介绍一下运行上边程序的过程。
    1、编译上边的程序,需要classpath中加入slf4j-api-1.4.1.jar文件
    2、运行时,需要classpath中加上slf4j-simple-1.4.1.jar
    运行得到结果:
    ----------------------------
    0 [main] ERROR Wombat - Temperature set to 1. Old temperature was null.
    0 [main] ERROR Wombat - Temperature set to 55. Old temperature was 1.
    0 [main] INFO Wombat - Temperature has risen above 50 degrees.
    这个是simple log风格,
    3、切换:如果想切换到jdk14的log的风格,只需要把slf4j-simple-1.4.1.jar
    从classpath中移除,同时classpath中加入slj4j-jdk14-1.4.1.jar
    这时的运行结果:
    ---------------------------------------------------
    2007-7-9 10:40:15 Wombat setTemperature
    严重: Temperature set to 1. Old temperature was null.
    2007-7-9 10:40:16 Wombat setTemperature
    严重: Temperature set to 55. Old temperature was 1.
    2007-7-9 10:40:16 Wombat setTemperature
    信息: Temperature has risen above 50 degrees.
    已经变成jdk14的log风格了。
    4、再次切换到log4j
    同样移除slj4j-jdk14-1.4.1.jar,加入slf4j-log4j12-1.4.1.jar,同时加入log4j-1.2.x.jar
    加入log4j.properties。得到显示结果:
    ---------------------------------------
    10:42:27,328 ERROR Wombat: Temperature set to 1. Old temperature was null.
    10:42:27,328 ERROR Wombat: Temperature set to 55. Old temperature was 1.
    10:42:27,328 INFO Wombat: Temperature has risen above 50 degrees.
    在不同的风格中切换只需要在部署期切换类库就可以了,和开发时无关。

  • 相关阅读:
    Jenkins安装后,安装插件失败。报错SunCertPathBuilderException
    计算机网络
    abaqus
    品优购
    html5 css3
    css定位
    元素的显示与隐藏 / 精灵图
    学成在线案例
    css(3)
    css(2)
  • 原文地址:https://www.cnblogs.com/olmlo/p/3143468.html
Copyright © 2011-2022 走看看