common-logging 获取logFactory

0. 如果已经创建,则从保存了的Hashtable型的factories直接取得,返回
LogFactory factory = getCachedFactory(contextClassLoader);
if (factory != null) {
   return factory;
}
//.....
factory = (LogFactory) factories.get(contextClassLoader);

否则

0准备:读取commons-logging.properties ,将 thisClassLoader = getClassLoader(LogFactory.class); 作为baseClassLoader。baseClassLoader = thisClassLoader;
1. 读取global system property 配置

//org.apache.commons.logging.LogFactory 
String factoryClass = getSystemProperty(FACTORY_PROPERTY, null);
 factory = newFactory(factoryClass, baseClassLoader, contextClassLoader);
2. 如空,利用JDK1.3 开始提供的service 发现机制,扫描classpah 下的META-INF/services/org.apache.commons.logging.LogFactory 文件
InputStream is = getResourceAsStream(contextClassLoader,SERVICE_ID);
 rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
 String factoryClassName = rd.readLine(); //获得factoryClassName
 factory = newFactory(factoryClassName, baseClassLoader, contextClassLoader );
3. 如空,读取0步骤已经读入的commons-logging.properties文件
String factoryClass = props.getProperty(FACTORY_PROPERTY);
factory = newFactory(factoryClass, baseClassLoader, contextClassLoader);

4. 如空,则采用默认的logFactory:org.apache.commons.logging.impl.LogFactoryImpl

factory = newFactory(FACTORY_DEFAULT, thisClassLoader, contextClassLoader);

善后:  1. 将factory保存到Hashtable中,不用再重新创建了

cacheFactory(contextClassLoader, factory);
   2. 设置factory的属性
if( props!=null ) {
                Enumeration names = props.propertyNames();
                while (names.hasMoreElements()) {
                    String name = (String) names.nextElement();
                    String value = props.getProperty(name);
                    factory.setAttribute(name, value);
                }
            }

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

和log4j的集成

1. 配置commons-logging.properties文件为:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
2. 不配文件
    这种方式下是怎么自动切换到log4j的呢?
    在LogFactoryImpl中有个getLogConstructor()方法,
if (logConstructor == null) {
            discoverLogImplementation(getClass().getName());
        }
   而在discoverLogImplementation()中会创建该LogFactory
for(int i=0; (i<classesToDiscover.length) && (result == null); ++i) {
            result = createLogFromClass(classesToDiscover[i], logCategory, true);
        }
   classesToDiscover的定义为
private static final String[] classesToDiscover = {
            LOGGING_IMPL_LOG4J_LOGGER,
            "org.apache.commons.logging.impl.Jdk14Logger",
            "org.apache.commons.logging.impl.Jdk13LumberjackLogger",
            "org.apache.commons.logging.impl.SimpleLog"
    };
可以看出,创建logFactory的优先级为log4j-->Jdk14Logger-->Jdk13LumberjackLogger-->SimpleLog


你可能感兴趣的:(common-logging 获取logFactory)