java日志学习笔记

1,JCL(Jakarta Commons Logging)与Log4j的关系:

   Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口,对其它一些日志工具,包括Log4J, Avalon LogKit, and JDK 1.4等,进行了简单的包装,此接口更接近于Log4JLogKit的实现。

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适应其他日志方式。

===========================================================

jcl-over-slf4j.jar

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包同时使用,会陷入死循环。

你可能感兴趣的:(logback,slf4j,休闲,lo4j,jcl)