`

日志管理(一):slf4j原理简单介绍

 
阅读更多

转载自:http://blog.sina.com.cn/s/blog_6f67b91d0100tpqh.html

 

全称: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,Each of these jar files is hardwired at compile-time to use just one implementation, that is NOP, Simple, log4j version 1.2, log4j version 1.3, JDK 1.4 logging, and repectively JCL等.

    SLF4J支持多个日志系统,比如NOP, Simple, log4j version 1.2, log4j version 1.3, JDK 1.4 logging, JCL and logback。

 

     其实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 相当,定义高层 API commons-logging-1.1.jar
slf4j-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.Log4JLogger
log4j-1.2.15.jar 一样 log4j-1.2.15.jar
log4j.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的方法.

import  org.slf4j.Logger;
 import  org.slf4j.LoggerFactory;
 public   class  Wombat  {
      final  Logger logger  =  LoggerFactory.getLogger(Wombat. class );
     Integer t;
     Integer oldT;
      public   void  setTemperature(Integer temperature)  {
         oldT  =  t;
         t  =  temperature;
         logger.error( " Temperature set to {}. Old temperature was {}. " , t, oldT);
          if  (temperature.intValue()  >   50 )  {
             logger.info( " Temperature has risen above 50 degrees. " );
         } 
     } 
      public   static   void  main(String[] args)  {
         Wombat wombat  =   new  Wombat();
         wombat.setTemperature( 1 );
         wombat.setTemperature( 55 );
     } 
 }

 下边介绍一下运行上边程序的过程。
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.
在不同的风格中切换只需要在部署期切换类库就可以了,和开发时无关。

  • 大小: 73.5 KB
分享到:
评论
1 楼 ueu2715 2013-09-10  
如果有日志实现的包,要写一个包,实现slf4j与日志实现包的连接。该从何入手呢。

相关推荐

    slf4j日志框架的源代码分享

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

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

    Slf4j是一个简单的日志外观模式,它提供了统一的日志接口,使得用户可以选择不同的日志实现。Slf4j的出现使得日志系统的开发变得更加灵活和便捷。Slf4j的优点包括: 1. 兼容性强:Slf4j可以与多种日志系统集成,如...

    slf4j-1.7.2.zip

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。这个"slf4j-1.7.2.zip"压缩包包含了SLF4J...

    slf4j-log4j12 等jar包.rar

    1. **SLF4J**:SLF4J的设计目标是为各种日志API提供一个简单统一的接口,这样应用程序就可以在不修改代码的情况下更换日志框架。它提供了API,而具体的实现则需要开发者根据项目需求选择,如Logback、Log4j等。SLF4J...

    slf4j包1.6.4版

    SLF4J(Simple Logging Facade for Java)是Java日志记录的一个接口层,它为各种日志框架,如Log4j、Java Util Logging、Logback等,提供...通过理解SLF4J的工作原理和用法,开发者可以更有效地管理和控制应用的日志。

    slf4j jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供一个简单的统一接口,使得最终用户能够在部署时配置自己希望的日志框架。这个jar包集合包含了不同版本的...

    slf4j 所需要的jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架提供了一个统一的API,如Log4j、Java Util ...同时,理解SLF4J的工作原理和最佳实践,对于优化日志管理和提升项目质量至关重要。

    slf4j与其它日志api的结合

    SLF4J的主要目的是为各种日志API提供一个简单统一的接口,使得最终用户能够在部署他们的应用时插入所需的日志框架。 日志API在软件开发中扮演着重要角色,它帮助开发者跟踪程序的运行状态,调试错误,记录关键事件...

    slf4j-1.5.8.zip

    SLF4J(Simple Logging Facade for Java)是Java日志框架的一个接口层,它为各种日志实现提供了一个统一的API,比如Log4j、java.util.logging、Logback等。这个版本是SLF4J的1.5.8版,尽管较旧,但仍然包含了许多...

    slf4j-1.5.5

    SLF4J(Simple Logging Facade for Java)是Java平台上的一种日志抽象层,它为各种日志框架,如Log4j、Java Util Logging、Logback等提供了一个统一的接口,使得开发者能够在运行时选择合适的日志实现。SLF4J的1.5.5...

    slf4j-1.5.11 jar包,源文件

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供了一个简单的接口。SLF4J的主要目的是使应用程序能够在其开发阶段选择任何日志框架,而无需在部署时...

    slf4j输入日志到mongodb

    SLF4J(Simple Logging Facade for Java)是Java中一个用于日志记录的抽象层,它提供了一种标准的日志记录接口,使得开发者可以选择不同的日志实现框架,如Log4j、Logback等。MongoDB则是一个流行的NoSQL数据库系统...

    Slf4j-1.5.8

    4. **slf4j-nop.jar**:一个无操作的日志实现,完全不执行任何日志记录。在不需要日志功能或者想关闭日志的情况下,可以使用这个实现。 5. **slf4j-jdk14.jar**:这个适配器允许SLF4J使用Java内置的日志系统(java....

    slf4j-api-1.6.1.jar + slf4j-nop-1.6.1.jar

    总结来说,`slf4j-api-1.6.1.jar`提供了SLF4J的日志API,而`slf4j-nop-1.6.1.jar`是一个简单的日志实现,用于测试或无日志输出的场景。SLF4J作为一个抽象层,提高了日志处理的灵活性和可维护性,是现代Java应用程序...

    log4j-slf4j-impl.zip

    而Log4j-SLF4J-Impl则是SLF4J的一个绑定,它使得我们可以在应用中使用SLF4J API,同时实际的日志输出由Log4j负责。这种设计使得更换日志框架变得简单,只需更改绑定即可。 二、SLF4J的工作机制 SLF4J通过定义一套...

    slf4j 1.5.0 源码

    SLF4J(Simple Logging Facade for Java)是Java日志框架的一个接口层,它为各种日志实现提供了一个统一的API,使得开发者能够在不修改代码的情况下切换不同的日志实现,如Log4j、Java内置的日志系统(java.util....

    slf4J的所有相关jar

    SLF4J的主要目的是为各种日志框架,如log4j、logback、java.util.logging等,提供一个简单统一的接口,使得最终用户能够在部署时插入他们所选择的日志框架,而无需重新编译代码。SLF4J的设计理念是解耦应用程序的...

    slf4j-log4j12-1.7.2.jar 亲测可用

    SLF4J (Simple Logging Facade for Java) 是一个用于日志记录的接口层,它为各种日志框架,如Logback、Log4j、Java Util Logging等提供了一个统一的API。SLF4J的主要目的是使得应用程序可以在部署时选择任何支持的...

    slf4j-1.7.10.tar.gz

    1. **日志接口**:SLF4J提供了一组简单但功能强大的API,包括`Logger`接口,用于记录不同级别的日志信息,如`trace`、`debug`、`info`、`warn`和`error`。`Marker`接口则用于分类和标记日志消息,增强了日志的可读性...

    slf4j-1.5.2.zip

    2. **slf4j-simple.jar**:这是一个简单的日志实现,将所有日志输出到控制台。如果你的项目只用了这个,那么`StaticLoggerBinder`应该可以从这个JAR中找到。 3. **slf4j-log4j12.jar**:这个JAR桥接了SLF4J和Log4j...

Global site tag (gtag.js) - Google Analytics