鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 手机系统开发 > J2ME > >

SLF4J 的几种实际应用模式

来源:互联网 作者:佚名 时间:2015-08-02 08:10
SLF4J(Simple Logging Facade for Java) 是一个通用的日志框架,不能何以谓之 Facade(门面),所扮眼的角色相当于 Jakarta Commons Logging。就像 JCL 需要底层的日志实现,如 Log4J、java.util.logging、Simple Logger 等来完成具体的信息输出,事实上基本总
SLF4J(Simple Logging Facade for Java) 是一个通用的日志框架,不能何以谓之 Facade(门面),所扮眼的角色相当于 Jakarta Commons Logging。就像 JCL 需要底层的日志实现,如 Log4J、java.util.logging、Simple Logger 等来完成具体的信息输出,事实上基本总是 JCL+Log4J 那么一个绝配。SLF4J 的原旨也是能支持多种下层日志框架实现,但最好的日志实现仍然是 Log4J,所以本篇讲述 SLF4J 的第一种用法 SLF4J+Log4J。

 

 需要的配置文件和组件包,下面三个 jar 文件和一个 properties 文件都是要放在项目的 ClassPath 上。 

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)

 

log4j.properties

 

使用 SLF4J  的代码:

 

执行它,控制台输出: 

 

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

 

把这种 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+LogBack

 

前面讲的 SLF4J 的用法之一是 SLF4J+Log4J,而这里要推出的组合是 SLF4J+LogBack。不用 Log4J?难道还有比 Log4J 更好的日志实现吗?是的,答案就是 LogBack。假如你知道 LogBack 和 Log4J 是同出一位大师之手,你就不会觉得惊讶了。LogBack 对 Log4J 进行了增强,并投入了 SLF4J 的怀抱,它还被作者认定为 Log4J 的继任者。 

 

Logback 分为三个模块:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身实现了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日志实现,如原始的 Log4J,java.util.logging 等;logback-access 让你方便的访问日志信息,如通过 http 的方式。 

还得提一点,Logback 能更好的放到 OSGI 环境中。好了,简单绍完了 Logback,就来看看具体怎么用它。 

需要的配置文件和组件包,下面三个 jar 文件和一个 xml文件都是要放在项目的 ClassPath 上。 

 

slf4j-api-1.5.11.jar 
logback-core-0.9.20.jar 
logback-classic-0.9.20.jar 
logback.xml 或 logback-test.xml (类似于 log4j.properties/log4j.xml) 

 

Logback 先找 logback-test.xml,没有则找 logback.xml 文件,都找不到就使用 BasicConfigurator 基本配置,BasicConfigurator 就是相当于等会贴出的 logback.xml 文件内容的配置。这里我们用 logback.xml 配置文件,以前的 log4j.properties  文件可以用 PropertiesTranslator 转换成 logback.xml 文件内容。 

 

下面是一个最简单的 logback.xml 文件内容

 

 

在 log4j.xml 能做的配置,logback.xml 中也能做到,而且还增强了诸如 <if><then><else>、<filter>、<sift> 等更强的控制,请参考 logback 的手册 http://logback.qos.ch/manual/index.html。 

 

使用 Logback  的代码 

可以看到与使用 SLF4J 的代码没有任何区别,因为本来用的通用日志框架就是 SLF4J,说到底,这里的 Logback 就相当于 SLF4J+Log4J 使用方式中的 Log4J 绑定和 Log4J 的功能。

执行上面的代码,输出: 

21:38:43.031 [main] INFO  com.unmi.TestLogback - Hello TestLogback 

还是和上次一样,这里就拿 SLF4J+Logback 和 SLF4J+Log4J 两种方式作下比较:

 

 

网友评论
<