`

SLF4J的简单使用

阅读更多

http://www.slf4j.org/全称: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那么多包怎么用。

其 实 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的方法.

 

 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.
在不同的风格中切换只需要在部署期切换类库就可以了,和开发时无关。

分享到:
评论

相关推荐

    slf4j-Logging

    几乎在每个jar包里都可以看到log4j的身影,在多个子工程构成项目中,slf4j相关的冲突时不时就跳出来让你不爽,那么slf4j-api、slf4j-log4j12还有log4j他们是什么关系?我把自己了解的和大家简单分享一下: slf4j:...

    SLF4J详细资料

    从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样...

    slf4j 1.6.4

    从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样...

    slf4j日志,可以使用它代替LOG4J

    slf4j slf4j slf4j日志。日志系统,代替LOG4J,可以去网上搜下使用方法。十分简单有效

    slf4j-api-1.7.5日志打印实验源码

    在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对...

    slf4j-nop-1.6.1.jar

    从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样...

    slf4j使用手册

    简单介绍了SLF4J的功能,结构,并介绍了其常用的log实现框架log4j的appender结构,是slf4j新手非常不错的入门手册,这可以我自已编写的.欢迎大家指正.

    slf4j-gao.rar

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

    slf4j-api-1.7.2.jar

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

    slf4j-1.5.2.jar

    类org.slf4j.impl.StaticLoggerBinder并不在slf4j-api-1.5.2.jar包中,仔细查看每个与具体日志系统对应的jar包,就会发现,相应的jar包都有一个org.slf4j.impl.StaticLoggerBinder的实现,不同的实现返回与该日志...

    slf4j门面模式学习用的jar包,版本为1.7.30

    slf4j-api-1.7.30.jar(slf4j门面)、slf4j-simple-1.7.30.jar(slf4j的简单实现)、slf4j-jdk14-1.7.30.jar(slf4j与JUL日志框架绑定)、slf4j-log4j12-1.7.30.jar(slf4j与Log4j日志框架的绑定)、log4j-over-slf4...

    slf4j-1.5.5

    slf4j-1.5.5是java开发中的hibernate框架中的jar包实现了日志简单处理

    slf4j1.6.1-1.6.4.zip

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

    slf4j实现热加载日志级别

    一个简单的例子slf4j实现热加载日志级别

    slf4j1.7最新版

    SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志...按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。 sfj可以简化日志的开发。

    slf4j结合log4j的demo,带配置文件

    slf4j结合log4j,java简单实例,以及所用jar包!!

    slf4j-api-1.7.21.jar_slf4j-simple-1.7.25.jar_mina-core-2.0.16.jar.rar

    简单的Mina Server用到的三个jar包,官网的资料可以看一下 http://mina.apache.org/mina-project/quick-start-guide.html qndroid老师的视频基础跳过了,加了这三个包服务端是没报错了 ...

    slf4j-simple-1.7.25.jar

    slf4j-simple-1.7.25.jar 简单实现包,

    slf4j-1.5.6.tar.zip

    SLF4J是一个用于日志系统的简单Facade,很有用,可以直接用作输出记录文件

    slf4j+logback日志系统介绍

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

Global site tag (gtag.js) - Google Analytics