Log4J源码分析(一)
程序员文章站
2022-07-05 09:46:59
...
面对这近20000行代码,188个类,还真是有点不知从何下手。万事开头难嘛!既然使用Log4J是从Category类开始的,那也从它开始分析。
Category类位于org.apache.log4j包内,检查它的类层次图,它实现了AppenderAttachable接口。
AppenderAttachable接口同样位于org.apache.log4j包内,查看它的源码,很明显,它可以被视为一个Appender的容器,所以Category类也可以当作是Appender的容器。
但是,事情没这么简单,在Category类中有个私有域:
AppenderAttachableImpl aai
AppenderAttachableImpl是什么?显然,从其名字可知,它是AppenderAttachable接口的一个实现。查看它的源码,它拥有一个私有域Vector appenderList,并在其上实现了AppenderAttachalbe接口。此外,AppenderAttachableImpl还添加了一个重要的方法:
/**
Call the doAppend method on all attached appenders. */
public
int appendLoopOnAppenders(LoggingEvent event) {
int size = 0;
Appender appender;
if(appenderList != null) {
size = appenderList.size();
for(int i = 0; i < size; i++) {
appender = (Appender) appenderList.elementAt(i);
appender.doAppend(event);
}
}
return size;
}
从这个方法的实现来看,它像是观察者(Observer)模式中的Notify方法。通过观察Appender的实现,可以肯定在这里使用了这模式,Appender做为AppenderAttachableImpl的观察者。
转载:http://jmut.bokee.com/
Category类位于org.apache.log4j包内,检查它的类层次图,它实现了AppenderAttachable接口。
AppenderAttachable接口同样位于org.apache.log4j包内,查看它的源码,很明显,它可以被视为一个Appender的容器,所以Category类也可以当作是Appender的容器。
但是,事情没这么简单,在Category类中有个私有域:
AppenderAttachableImpl aai
AppenderAttachableImpl是什么?显然,从其名字可知,它是AppenderAttachable接口的一个实现。查看它的源码,它拥有一个私有域Vector appenderList,并在其上实现了AppenderAttachalbe接口。此外,AppenderAttachableImpl还添加了一个重要的方法:
/**
Call the doAppend method on all attached appenders. */
public
int appendLoopOnAppenders(LoggingEvent event) {
int size = 0;
Appender appender;
if(appenderList != null) {
size = appenderList.size();
for(int i = 0; i < size; i++) {
appender = (Appender) appenderList.elementAt(i);
appender.doAppend(event);
}
}
return size;
}
从这个方法的实现来看,它像是观察者(Observer)模式中的Notify方法。通过观察Appender的实现,可以肯定在这里使用了这模式,Appender做为AppenderAttachableImpl的观察者。
转载:http://jmut.bokee.com/
上一篇: Log4J源码分析(三)
下一篇: 我们公司不适合你