`
chillwarmoon
  • 浏览: 155315 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读commons-logging源码有感

阅读更多
转载请注明出处http://chillwarmoon.iteye.com
昨天读了一下commons-logging和log4j的部分源码,收获不少。使用日志时,为什么要两个包全部包含到程序中,这两个包之间的关系如何,是怎么样关联起来的?当我们使用日志时为何只依赖于commons-logging所定义的接口,这些接口与log4j是什么关系?两个日志的配置文件在配置时是否有冲突?在分析完代码之后,这些问题迎刃而解。
一、对commons-logging源码分析
   在程序中使用日志时,经常将两个包放到程序的classpath目录下,在程序中调用LogFactory.getLog("XXX"),返回的是Log对象,无论是LogFactory,还是Log,都与log4j无关,但是在classpath中,我们需要配置log4j.properties,其中规定了一些log4j的使用属性。
   1.首先从LogFactory.getLog("XXX")入手进行分析。在LogFactory第一次使用时调用静态块,初始化属性thisClassLoader为加载LogFactory的classLoader。在方法getLog(String arg)中,调用getFactory().getInstance(name)。
   2.getFactory()
   (1)得到当前线程的contextClassLoader,以contextClassLoader为关键字查找缓存中是否有相应的factory存在,如果有,则返回该factory;
   (2)从contextClassLoader或者systemClassLoader中得到资源commons-logging.properties,若该配置文件中的use_tccl属性为false,则baseContextClassLoader指定为thisClassLoader,否则为contextClassLoader;
   (3)建立factory
      若通过System.setProperty得到以org.apache.commons.logging.LogFactory为key的值,则以该值为类名字来newFactory
      若通过contextClassLoader找到资源META-INF/services/org.apache.commons.logging.LogFactory,则以资源中规定的类名字来newFactory
      若通过commons-logging.properties得到以org.apache.commons.logging.LogFactory为key的值,则以该值为类名字来newFactory
      默认以类LogFactoryImpl来newFactory
   (4)以contextClassLoader来缓存建立的factory
   通过分析容易知道,这里是以默认的方式来建立的factory并缓存起来的。即factory对象是通过实例化LogFactoryImpl来建立的。
   3.getInstance():
   (1)以name为关键字查看缓存是否有Log对象存在,如果有则返回;
   (2)发现Log的实现方式:
      若在commons-logging.properties得到以org.apache.commons.logging.Log为key的值,则以该值为类名字来createLogFromClass
      依次以Log4JLogger、Jdk14Logger、Jdk13LumberjackLogger、SimpleLog为类名字来createLogFromClass,
      如果建立成功则返回该Log实现,注意这里的实现是commons-logging中的实现。
   (3)以name为参数,调用得到的Log实现的构造函数,返回Log对象。
二、关键点
   1.如何createLogFromClass
     (1)首先得到的是baseClassLoader。若useTCCL为false,则为thisClassLoader;若没有指定该值,则选择TCCL和TCL中的一个Lowest作为baseClassLoader,例如:如果TCCL是TCL的父classLoader,则选择TCL。一般而言,Lowest的ClassLoader为TCCL。
     (2)若baseClassLoader不为空,则利用baseClassLoader来找到资源Log4JLogger.class,否则利用systemClassLoader找到资源Log4JLogger.class。并用该classLoader加载该Log类。
   2.与log4j的联系
     由baseClassLoader加载的Log类,是commons-logging中的类,在Log4JLogger中存在有对log4j中的Logger类的引用,因此在Log4JLogger构造函数中对Logger属性进行了初始化,以后的Log.debug,Log.info等方法完全是委派到log4j中的logger属性来执行的。
     因此在程序中,我们只看到commons-logging而并没有见到log4j的API。
分享到:
评论

相关推荐

    commons-logging.jar

    commons-logging-1.0-javadoc.jar, commons-logging-1.0.1-javadoc.jar, commons-logging-1.0.1.jar, commons-logging-1.0.2-javadoc.jar, commons-logging-1.0.2.jar, commons-logging-1.0.3-javadoc.jar, commons-...

    commons-logging-1.2-bin.zip下载

    这个"commons-logging-1.2-bin.zip"压缩包包含了Apache Commons Logging库的1.2版本,这是一个稳定且广泛使用的版本。 Commons Logging 提供了一组接口和辅助类,使得应用程序可以透明地使用任何兼容的日志实现,...

    commons-logging-1.2-API文档-中英对照版.zip

    赠送jar包:commons-logging-1.2.jar; 赠送原API文档:commons-logging-1.2-javadoc.jar; 赠送源代码:commons-logging-1.2-sources.jar; 包含翻译后的API文档:commons-logging-1.2-javadoc-API文档-中文...

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

    赠送jar包:commons-logging-1.1.3.jar; 赠送原API文档:commons-logging-1.1.3-javadoc.jar; 赠送源代码:commons-logging-1.1.3-sources.jar; 赠送Maven依赖信息文件:commons-logging-1.1.3.pom; 包含翻译后...

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

    赠送jar包:commons-logging-1.2.jar; 赠送原API文档:commons-logging-1.2-javadoc.jar; 赠送源代码:commons-logging-1.2-sources.jar; 包含翻译后的API文档:commons-logging-1.2-javadoc-API文档-中文...

    spring-framework & commons-logging

    framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-...

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

    赠送jar包:commons-logging-1.1.3.jar; 赠送原API文档:commons-logging-1.1.3-javadoc.jar; 赠送源代码:commons-logging-1.1.3-sources.jar; 赠送Maven依赖信息文件:commons-logging-1.1.3.pom; 包含翻译后...

    commons-logging-1.2_commonslogging_

    在标题"commons-logging-1.2_commonslogging_"中提到的"commons-logging-1.2.jar"就是这个库的1.2版本,它是Spring框架中常用的一个依赖,用于处理日志记录。 Spring框架广泛使用Commons Logging作为其默认的日志...

    commons-logging-1.1.3.jar

    common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。...

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

    赠送jar包:commons-logging-1.1.1.jar 赠送原API文档:commons-logging-1.1.1-javadoc.jar 赠送源代码:commons-logging-1.1.1-sources.jar 包含翻译后的API文档:commons-logging-1.1.1-javadoc-API文档-中文...

    commons-logging-1.2.JAR开源包

    标题中的"commons-logging-1.2.JAR"是Commons Logging 1.2版本的JAR包,它是该库的二进制发行版,包含了所有用于提供日志服务的类和接口。开发者可以将这个JAR文件添加到项目的类路径中,以便利用其提供的日志功能。...

    commons-logging-1.1.3-bin.zip

    描述中的“commons-logging-1.1.3 jar”提到了核心的logging库本身,即commons-logging-1.1.3.jar。这个JAR文件包含了Commons Logging的API,开发者可以导入并使用这个库来编写日志代码。 标签“commons logging....

    commons-logging-1.0.4.jar 免费下载

    在给定的标题 "commons-logging-1.0.4.jar 免费下载" 中,我们讨论的是 Commons Logging 的一个特定版本,即 1.0.4。 在 Java 开发中,日志是非常关键的工具,用于记录应用程序运行时的信息,包括错误、警告、调试...

    commons-beanutils.jar、commons-logging.jar两个包

    beanUtils 方便访问javaBean 附带支持框架 logging jar包,Apache提供的这个beanutils包极大方便了javabean的 操作。包含了最新的commons-beanutils-1.9.3.jar,以及其依赖的commons-logging-1.2.jar包

    commons-beanutils.jar+commons-logging.jar

    Apache提供的这个beanutils包极大方便了javabean的 操作。包含了最新的commons-beanutils-1.9.3.jar和api文档,以及其依赖的commons-logging-1.2.jar包

    commons-logging-1.2.jar

    "commons-logging-1.2.jar"是Apache Commons Logging的1.2版本,它是Spring框架运行时的一个必需依赖。在搭建Spring开发环境时,确保此JAR文件在类路径中是非常关键的步骤。这个版本包含了Commons Logging的所有功能...

    hibernate使用的commons-logging-1.1.3.jar包

    《深入理解Hibernate中的commons-logging-1.1.3.jar包》 在Java开发领域,尤其是企业级应用中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。在Hibernate的运行环境中,`commons-...

    commons-logging-1.2

    Applications (rather than libraries) may also choose to use commons-logging. While logging-implementation independence is not as important for applications as it is for libraries, using commons-...

    log4j.jar和commons-logging.jar

    "log4j.jar" 和 "commons-logging.jar" 是两个非常著名的Java日志库,它们在Java日志处理中扮演着核心角色。 **log4j.jar** 是Apache软件基金会开发的一个开源日志框架,它为Java应用程序提供了灵活的日志记录解决...

Global site tag (gtag.js) - Google Analytics