转载请注明出处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-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"压缩包包含了Apache Commons Logging库的1.2版本,这是一个稳定且广泛使用的版本。 Commons Logging 提供了一组接口和辅助类,使得应用程序可以透明地使用任何兼容的日志实现,...
赠送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文档-中文...
赠送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; 包含翻译后...
赠送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文档-中文...
framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-logging spring-framework & commons-...
赠送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.jar"就是这个库的1.2版本,它是Spring框架中常用的一个依赖,用于处理日志记录。 Spring框架广泛使用Commons Logging作为其默认的日志...
common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。...
赠送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.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。 在 Java 开发中,日志是非常关键的工具,用于记录应用程序运行时的信息,包括错误、警告、调试...
beanUtils 方便访问javaBean 附带支持框架 logging jar包,Apache提供的这个beanutils包极大方便了javabean的 操作。包含了最新的commons-beanutils-1.9.3.jar,以及其依赖的commons-logging-1.2.jar包
标题中的"commons-logging-1.2.JAR"是Commons Logging 1.2版本的JAR包,它是该库的二进制发行版,包含了所有用于提供日志服务的类和接口。开发者可以将这个JAR文件添加到项目的类路径中,以便利用其提供的日志功能。...
Apache提供的这个beanutils包极大方便了javabean的 操作。包含了最新的commons-beanutils-1.9.3.jar和api文档,以及其依赖的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包》 在Java开发领域,尤其是企业级应用中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。在Hibernate的运行环境中,`commons-...
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" 是两个非常著名的Java日志库,它们在Java日志处理中扮演着核心角色。 **log4j.jar** 是Apache软件基金会开发的一个开源日志框架,它为Java应用程序提供了灵活的日志记录解决...