1,JCL(Jakarta Commons Logging)与Log4j的关系:
Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,进行了简单的包装,此接口更接近于Log4J和LogKit的实现。
2,JCL+Log4j配置过程:
(1)jar包准备:
commons-logging-1.1.1.jar(http://commons.apache.org/logging/download_logging.cgi)(Apache Commons)
log4j-1.2.16.jar (http://logging.apache.org/)(Logging Services)
(2)配置文件:log4j.properties or xml
Log4j中有三个主要的组件,它们分别是 Logger(控制出处级别)、Appender(输出目的地)和Layou(输出格式)。
(3)在业务类中调用日志:
package com.test.log;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestLog
{
private static Log log = LogFactory.getLog(TestLog.class);
public void test()
{
log.debug("111");
log.info("222");
log.warn("333");
log.error("444");
log.fatal("555");
}
public static void main(String[] args)
{
TestLog testLog = new TestLog();
testLog.test();
}
}
3,JCL原理:
(1)优点:
l ) 提供一个统一的日志接口,简单了操作,同时避免项目与某个日志实现系统紧密a耦合
2) 很贴心的帮我们自动选择适当的日志实现系统(这一点非常好!)
3) 它甚至不需要配置
(2)选择日志实现系统的原理(顺序)(commons-logging-1.1.1.jar):
static Log log = LogFactory.getLog(TestLog.class);
在 getLog() 中是通过 getFactory() 方法获得具体的 LogFactory 实现类(每个日志实现系统都会提供LogFactory实现类)
1). 从系统属性中查找键为 org.apache.commons.logging.LogFactory 的值作为 LogFactory 的实现类;具体通过 System.getProperty("org.apache.commons.logging.LogFactory") 获得;
2).使用 JDK1.3 jar 的 Service Provider Interface(SPI) 类发现机制,从配置文件 META-INF/services/org.apache.commons.logging.LogFactory 的的第一行读取 LogFactory 的实现类名。这个 META-INF/services/org.apache.commons.logging.LogFactory 文件可以是某个 Web 应用的根目录中;也可以在 classpath 下,如某个 Jar 包中,WebRoot/WEB-INF/classes 中等。这里需多加留心下 META-INF/services/org.apache.commons.logging.LogFactory 这个目录层次及文件名;
3). 在 Classpath 下的 commons-logging.properties 文件中的,找到 org.apache.commons.logging.LogFactory 属性值作为 LogFactory 实现类;
4).前面三步未找个 LogFactory 的实现类,或有任何异常的情况下,就用默认的实现类,即 LogFactory 为我们准备的 org.apache.commons.logging.impl.LogFactoryImpl。(如果提供了Log4j的jar包,会在这一步找到log4j的实现)
4,如何在应用中配置已有组件的日志记录方式:
info:hibernate--JSF4J,spring--JCL,struts2--JCL(JUL)
Hibernate是依赖SLF4J的,引入hibernate而不导入SLF4J的jar包是不对的。
SLF4J+Log4j的过度jar包是slf4j-log4j12-1.5.11.jar,如果使用Log4j作为slf4j的实现类,这个也是必须的。
SLF4J+Log4j 与JCL+Log4j的整合方式是一样的,所以应用中使用JCL+Log4j,直接配置Log4j同样会影响到以后组件。可以通过指定如下属性进行具体控制:
log4j.logger.org.hibernate=info,CONSOLE,FILE
log4j.logger.com.opensymphony=info
log4j.logger.org.springframework=info
如果不配置,默认使用根日志的配置:
log4j.rootLogger=info, CONSOLE
5,SLF4J介绍:
全称为Simple Logging Facade for JAVA:java简单日志门面。 是对不同日志框架提供的一个门面封装。可以在部署的时候不修改任何配置即可接入一种日志实现方案。和commons-loging 应该有一样的初衷。Logging API实现既可以选择直接实现SLF4J接口的loging APIs如: logback、SimpleLogger。也可以通过开发相应的适配器来使用已有的API实现如 Log4jLoggerAdapter、JDK14LoggerAdapter。
官网:http://slf4j.org/
优点:
1)在不同的的实现类中切换,只需改变Jar包就可以了,和开发无关;
2)SLF4J 不依赖任何特殊的class loader机制,OSGI 机制更好兼容支持;
3)能支持多个参数,并通过{} 占位符进行替换,避免老写logger.isXXXEnabled 这种无奈的判断,带来性能提升。如果日志的参数超过3个,需要写成
Object[] params = {newVal, below, above};
logger.debug("Value {} was inserted between {} and {}.", params);
6,JCL与SLF4J的比较:
JCL+Log4j 是最佳搭档;
SLF4J+Logback 是最佳搭档;
SLF4J 的作者就是 log4j 的作者 Ceki Gülcü,他宣称 SLF4J 比 log4j 更有效率,而且比Apache Commons Logging(JCL) 简单、稳定。
slf4j由log4j作者Ceki开发,逐步取代apahce commons logging。
logback由log4j作者Ceki开发,逐步取代log4j。
slf4j等于commons-logging,是各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库。
logback相比较log4j的优势
slf4j支持参数化的logger.error("帐号ID:{}不存在", userId);
告别了if(logger.isDebugEnable()) 时代。
另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j。
另外:slf4j提供了一系列的jar包,可以将各种日志实现统一到slf4j中;而如果你已经使用了slf4j,可又不得不使用其他日志方式,也没关系,同样使用slf4j提供的jar包,让slf4j适应其他日志方式。
===========================================================
To ease migration to SLF4J from JCL, SLF4J distributions include the jar file jcl-over-slf4j.jar. This jar file is intended as a drop-in replacement for JCL version 1.1.1. It implements the public API of JCL but using SLF4J underneath, hence the name "JCL over SLF4J."
jcl-over-slf4j.jar
为了很容易的从JCL迁移到SLF4J,SLF4J发布了jcl-over-slf4j.jar这样的jar文件。这个jar文件的目的是作为 JCL1.1.1版本的一个替换。它实现了JCL的公共接口,但底层使用的是SLF4J,因此得名"JCL over SLF4J." 。
1,jcl-over-slf4j.jar《=====》slf4j-jcl.jar
2,log4j-over-slf4j.jar《====》slf4j-logj12.jar
3,jul-to-slf4j.jar《====》slf4j-jdk14.jar
以上成对的jar包同时使用,会陷入死循环。