1.我们从spring的ApplicationContext入手
在ApplicationContext中,在创造对象的时候就会获得日志,
this.logger = LogFactory.getLog(this.getClass());
2.在getLog方法中,就会去获得对应实现的工厂从而获得对应的log对象
public static Log getLog(Class clazz) throws LogConfigurationException {
return getFactory().getInstance(clazz);
}
(1)首先获得工厂
第一步:在类路径中查找是否有commons-logging.properties
第二步:在jvm中查找参数是否有定义org.apache.commons.logging.LogFactory
第三步:在META-INF/services/org.apache.commons.logging.LogFactory,这个路径查找LogFactory的包地址(在spring-jcl包中有一个该文件,里面写的是实现的包名:org.apache.logging.log4j.jcl.LogFactoryImpl)
第四步:以上都没有的话,就自己创建一个org.apache.commons.logging.impl.LogFactoryImpl的对象
(2)commons.logging桥接log4j2过程
在spring-jcl中有LogFactoryImpl类,该类包含一个适配器,该适配器是log4j2的接口类,对象是jcl的LogAdapter类。LogAdapter类继承了log4j2的AbstractLoggerAdapter类,该类包含getlogger方法,调用该方法实现桥接
private final LoggerAdapter<Log> adapter = new LogAdapter();
3.总结
通过以上步骤,jcl成功桥接了log4j2的适配类,通过条用施佩雷的getLog方法,从而调用log4j2的方法