您的位置:首页 > 其它

SLF4J 的几种实际应用模式--之一:SLF4J+Log4J

2013-09-22 14:11 357 查看


http://foxarmywave.blog.163.com/blog/static/173860086201161953644734/


【转】SLF4J 的几种实际应用模式--之一:SLF4J+Log4J

2011-07-19 17:36:44| 分类: 挨踢技术 | 标签:slf4j |字号 订阅

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)

前两个包在 http://www.slf4j.org/download.html 处下载,后一个包在http://logging.apache.org/log4j/1.2/download.html 下载,可能包文件名中的版本号有些差,不要紧。

log4j.properties 以前该是怎么写,现在还是怎么写,比如一个最简单的内容,只向控制台输出日志信息,如下:

1
2
3
4
log4j.rootLogger=DEBUG,console

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n


使用 SLF4J 的代码:

01
02
03
04
05
06
07
08
09
10
11
12
package
com.unmi;


import
org.slf4j.Logger;

import
org.slf4j.LoggerFactory;


public
class
TestSlf4j {

private
static
final
Logger logger = LoggerFactory.getLogger(TestSlf4j.
class
);


public
static
void
main(String[] args) {

logger.info(
"Hello {}"
,
"SLF4J"
);

}

}


执行它,控制台输出:

2010-04-07 17:14:51,390 [com.unmi.TestSlf4j]-[INFO] Hello SLF4J

把这种 SLF4J+Log4J 的使用模式与曾为霸主地位的 JCL+Log4J 的用法进行一下对比(请忽略掉包文件中的版本号):
SLF4J+Log4j 组合对比JCL+Log4J 组合
slf4j-api-1.5.11.jar相当,定义高层 APIcommons-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 环境中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: