`
zy19982004
  • 浏览: 661777 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251950
社区版块
存档分类
最新评论

Java日志学习二:Apache Commons Logging (JCL)源码

 
阅读更多

一.Apache Commons Logging

     http://zy19982004.iteye.com/blog/1867448里提到了commons-logging的工作方式,本文将看下代码怎么实现这一工作方式。

 

二.Apache Commons Logging类结构

     就这么简单,一个接口包,一个实现包。

 

三.类说明

  1. Log:A simple logging interface abstracting logging APIs,和JDBC API是一个性质的东西
  2. Level。对六种日志级别的操作,官网建议我们这样用:
    http://commons.apache.org/proper/commons-logging/guide.html 写道
    It is important to ensure that log message are appropriate in content and severity. The following guidelines are suggested:
    fatal - Severe errors that cause premature termination. Expect these to be immediately visible on a status console. See also Internationalization.
    error - Other runtime errors or unexpected conditions. Expect these to be immediately visible on a status console. See also Internationalization.
    warn - Use of deprecated APIs, poor use of API, 'almost' errors, other runtime situations that are undesirable or unexpected, but not necessarily "wrong". Expect these to be immediately visible on a status console. See also Internationalization.
    info - Interesting runtime events (startup/shutdown). Expect these to be immediately visible on a console, so be conservative and keep to a minimum. See also Internationalization.
    debug - detailed information on the flow through the system. Expect these to be written to logs only.
    trace - more detailed information. Expect these to be written to logs only.
     
  3. LogFactory:抽闲类,获得Log类。 getFactory()先从缓存里取LogFactory,取不到再去找,然后放进缓存。其中找的这段代码如下
    public static final String FACTORY_PROPERTY = "org.apache.commons.logging.LogFactory"
    protected static final String SERVICE_ID = "META-INF/services/org.apache.commons.logging.LogFactory"
    public static final String FACTORY_PROPERTIES = "commons-logging.properties"
    public static final String FACTORY_DEFAULT = "org.apache.commons.logging.impl.LogFactoryImpl"
    
    public static LogFactory getFactory() throws LogConfigurationException {
    	//1.系统环境变量里是否定义了LogFactory实现类,System.getProperty(FACTORY_PROPERTY)
    	//2.利用JDK1.3 开始提供的service 发现机制,会扫描classpah 下的SERVICE_ID文件,若找到则装载里面的配置,使用里面的配置
    	//3.Classpath下有FACTORY_PROPERTIES文件的话,看此properties里有无定义FACTORY_PROPERTY
    	//4.如果123找不到LogFactory实现类,使用FACTORY_DEFAULT
    }
     
     public abstract Log getInstance(String name)
            throws LogConfigurationException;
    public abstract Log getInstance(Class clazz)
            throws LogConfigurationException;
    
    public static Log getLog(String name)
            throws LogConfigurationException {
            return (getFactory().getInstance(name));
        }
    
    public static Log getLog(Class clazz)
            throws LogConfigurationException {
            return (getFactory().getInstance(clazz));
        }
    
      
  4. LogFactoryImpl,实现LogFactory,真正产生Log类的地方。首先从缓存里取Log,取不到就按照http://zy19982004.iteye.com/blog/1867448 中的顺序加载Log类。(i<classesToDiscover.length) && (result == null)就是这里。
    public Log getInstance(Class clazz) throws LogConfigurationException {
            return (getInstance(clazz.getName()));
        }
    
    public Log getInstance(String name) throws LogConfigurationException {
            Log instance = (Log) instances.get(name);
            if (instance == null) {
                instance = newInstance(name);
                instances.put(name, instance);
            }
            return (instance);
        }
    
    private static final String[] classesToDiscover = {
                "org.apache.commons.logging.impl.Log4JLogger",
                "org.apache.commons.logging.impl.Jdk14Logger",
                "org.apache.commons.logging.impl.Jdk13LumberjackLogger",
                "org.apache.commons.logging.impl.SimpleLog"
        };
    
    
    private Log discoverLogImplementation(String logCategory)
        throws LogConfigurationException
        {
            // See if the user specified the Log implementation to use
            //1).首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
    
    //2) 如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;
    
            String specifiedLogClassName = findUserSpecifiedLogClassName();
    
            if (specifiedLogClassName != null) {
                            result = createLogFromClass(specifiedLogClassName,
                                            logCategory,
                                            true);
                return result;
            }
            //3) 否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
    
    //4) 否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
    
    //5) 否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog;
    
                  for(int i=0; (i<classesToDiscover.length) && (result == null); ++i) {
                result = createLogFromClass(classesToDiscover[i], logCategory, true);
            }
            
                    return result; 
    
    createLogFromClass方法使用Class.forName(logAdapterClassName, true, currentCL),看classpath下是否有此logAdapterClassName 
  5. Log4JLogger:包装了org.apache.log4j.Logger。
  6. Jdk14Logger:包装了JDK1.4的java.util.logging.Logger。
  7. Jdk13LumberjackLogger:包装了JDK1.3及以前版本的java.util.logging.Logger。
  8. SimpleLog:自己实现的一个简单日志。
  9. NoOpLog:不记录日志,都是空方法。

 

四.Log实现类

 

 

五.commons-logging-api.jar

 

  1. 关于commons-logging-api.jar和commong-logging.jar的差别可以参考http://commons.apache.org/proper/commons-logging/guide.html
  2. commons-logging-api.jar it does not include the wrapper Log implementations that require additional libraries such as Log4j, Avalon and Lumberjack。必然的commons-logging.jar依赖log4j,而commons-logging-api.jar不依赖任何包。
  3. commons-logging.jar 和 log4j一起,LogFactory.getLog(X)得到的毫无疑问是org.apache.commons.logging.impl.Log4JLogger。
  4. commons-logging-api.jar 和 log4j一起,得到的是org.apache.commons.logging.impl.Jdk14Logger。为什么?commons-logging-api.jar和commons-logging.jar的LogFactoryImpl classesToDiscover都是一模一样的,但commons-logging-api.jar里根本没有Log4JLogger这个类,肯定加载不到,最终使用JDK自身的日志实现类,由Jdk14Logger包装。
  5. 总的来说,你想使用commons-logging和Log4j(或者Avalon Lumberjack),请使用commons-logging.jar 和 log4j。如果你只是想使用commons-logging做一个门面,其它日志做实现,如slf4j,请使用commons-logging-api.jar和slf4j相关jar。

六.总结

  1. LogFactory实现类的查找和Log实现类的查找是两回事。但它们均可以在commons-logging.properties里定义。
  2. 合理采用commons-logging-api.jar和commons-logging.jar,首选commons-logging.jar肯定不会出问题,如果追求代码的干净请合理使用commons-logging-api.jar。

 

 

1
1
分享到:
评论

相关推荐

    Apache Commons-logging使用实例

    Apache Commons-logging 是一个流行的Java日志记录库,提供了一个轻量级的日志记录接口,允许开发者使用不同的日志实现工具。下面是对 Apache Commons-logging 的使用实例的详细介绍。 1. Commons-Loggin 简介 ...

    Apache Commons Logging 1.2

    Apache Commons Logging 1.2

    Java日志学习一:Log4j和commons-logging的关系

    commons-logging通过简单的API调用,如`org.apache.commons.logging.LogFactory.getLog(Class)`,就能获取到相应的日志实现。 在实际应用中,如果你的项目使用了commons-logging,它会自动查找可用的日志实现,Log4...

    apache-commons-logging.zip

    Apache Commons Logging是一个开源Java日志框架,它是Apache软件基金会的一部分,广泛用于Java应用程序中。这个压缩包"apache-commons-logging.zip"包含了Apache Commons Logging库的源代码或编译后的JAR文件,允许...

    commons-logging-1.2

    Commons Logging 是 Apache 组织提供的一款轻量级的日志记录工具库,它的主要目标是为 Java 开发者提供一个简单的接口来使用各种日志框架,如 Log4j、Java Util Logging(JUL)或者 Simple Logging Facade for Java...

    Commons logging API.chm

    Commons-logging API apache Commons logging API

    commons-logging-1.1.3-API文档-中文版.zip

    标签:commons、logging、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用...

    commons-logging-1.2_commonslogging_

    《Spring框架中的日志工具:Apache Commons Logging 1.2》 Apache Commons Logging(简称Commons Logging)是Apache软件基金会开发的一个开源项目,它提供了一个轻量级的日志API,旨在为Java应用程序提供一个简单的...

    apache-commons-logging.jar.zip

    5. **适配器模式**:Apache Commons Logging通过适配器模式与不同的日志实现进行交互,这意味着即使在使用过程中更换日志框架,对应用代码的影响也会最小。 6. **性能和灵活性**:由于它的轻量级设计,Commons ...

    Apache Commons组件简介.ppt

    1. **Logging**:Apache Commons Logging 是一个轻量级的日志API,它的目的是为其他日志实现提供一个统一的接口。它允许开发者在不修改代码的情况下切换不同的日志实现,如Log4j。这样,你可以根据项目需求选择最...

    日志框架学习之一:commons-logging+log4j

    标题中的“日志框架学习之一:commons-logging+log4j”揭示了本文将探讨的是在Java开发中常用的两个日志处理工具——Apache Commons Logging和Log4j。这两个框架是日志记录的基础,广泛应用于各种Java应用程序,为...

    java 开发工具:commons-logging.jar(spring必备包)

    java 开发工具:commons-logging.jar(spring必备包)

    net.sf.json jar包(全部依赖)

    net.sf.json 是一个用于处理 JSON 数据格式的 Java 库,它提供了一组类和方法来解析、生成和操作 JSON 数据。...commons-logging:Apache Commons Logging 库,用于日志记录。 ezmorph:用于数据类型转换的库。

    commons-logging-1.1.3-API文档-中英对照版 (2).zip

    标签:commons、logging、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心...

    org.apache.commons.logging-sources-1.1.1.zip

    Apache Commons Logging 是一个Java日志库,它提供了一个接口,允许开发者使用多种不同的日志框架,如Log4j、Java内置的日志API(java.util.logging)或其他第三方日志实现。`org.apache.commons.logging-sources-...

    commons-logging的源码和jar包

    Apache Commons Logging 是一个轻量级的日志抽象层,它允许应用程序使用多种日志框架,而无需直接依赖具体的实现。这个库的主要目标是提供一个简单的接口,使得开发人员可以在多个不同的日志API之间进行切换,而不...

    commons-logging-1.0.4.zip

    Apache Commons Logging(简称Commons Logging)是Apache软件基金会的一个开源项目,它是Java平台上的一个轻量级的日志记录抽象层。这个库的主要目标是为Java应用程序提供一个简单、统一的接口来使用各种日志框架,...

    commons-logging-1.2源码(commons-logging-1.2-src.zip)

    Apache Commons Logging(简称Commons Logging)是Apache软件基金会开发的一个日志接口库,它提供了一个统一的日志API,允许开发者选择底层的日志实现,如Log4j、Java内置的日志系统或者其他的日志框架。Commons ...

    Commons Logging 源码解析一

    Commons Logging是Apache软件基金会开发的一个轻量级的日志记录工具包,它是Java日志框架的一个抽象层。这篇博文“Commons Logging 源码解析一”可能涉及到对这个库的内部工作原理、设计模式以及如何使用的深入探讨...

    apache-commons下源码大放送

    apache-commons下全部官方源码和官方API文档,其中有: commons-beanutils-1.8.0 commons-codec commons-collections commons-dbcp commons-dbutils commons-fileupload commons-io commons-lang commons-lang3 ...

Global site tag (gtag.js) - Google Analytics