Java日志学习二:Apache Commons Logging (JCL)源码
一.Apache Commons Logging
???? http://zy19982004.iteye.com/blog/1867448里提到了commons-logging的工作方式,本文将看下代码怎么实现这一工作方式。
?
二.Apache Commons Logging类结构
???? 就这么简单,一个接口包,一个实现包。
?
三.类说明
?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)); }??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?Log4JLogger:包装了org.apache.log4j.Logger。Jdk14Logger:包装了JDK1.4的java.util.logging.Logger。Jdk13LumberjackLogger:包装了JDK1.3及以前版本的java.util.logging.Logger。SimpleLog:自己实现的一个简单日志。NoOpLog:不记录日志,都是空方法。
?
四.Log实现类
?
?
五.commons-logging-api.jar
?
六.总结
?
?