JCL 原理
跳到导航
跳到搜索
https://www.bilibili.com/video/BV1iJ411H74S?p=19
通过 LogFactory 动态加载 Log 实现类
interface Log | ||||||
---|---|---|---|---|---|---|
Jdk13LumberjackLogger | LogKitLogger | SimpleLog | NoOpLog | Jdk14Logger | AvalonLogger | Log4JLogger |
动态加载 Log 实现类的核心代码
JCLTest.java
Log log = LogFactory.getLog(JCLTest.class);
LogFactory.java
public abstract class LogFactory {
……
public static Log getLog(Class clazz) throws LogConfigurationException {
return getFactory().getInstance(clazz);
}
……
}
LogFactoryImpl 是抽象类 LogFactory 的唯一子类
public class LogFactoryImpl extends LogFactory {
……
private static final String LOGGING_IMPL_LOG4J_LOGGER = "org.apache.commons.logging.impl.Log4JLogger";
……
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"
};
……
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;
}
……
protected Log newInstance(String name) throws LogConfigurationException {
……
if (logConstructor == null) {
instance = discoverLogImplementation(name);
}
……
}
……
private Log discoverLogImplementation(String logCategory)
throws LogConfigurationException {
……
for(int i=0; i<classesToDiscover.length && result == null; ++i) {
result = createLogFromClass(classesToDiscover[i], logCategory, true);
}
……
}
……
}