接下来,Log4J提供了一个AppenderSkeleton类来作为最基本的Appender的实现。在这个类里面简单的对Filter和ErrorHandler等做了一些流程性的处理,废话不多说,先来看看代码:
public abstract class AppenderSkeleton implements Appender, OptionHandler
首先这是个抽象的类,实现了Appender和OptionHandler接口,然后在这个抽象类里面定义了基础的Appender接口中的一些方法,比如怎么添加Filter,怎么添加ErrorHandler,怎么设置名字等,这些代码就忽略,接着看最重要的doAppend()方法:
public synchronized void doAppend(LoggingEvent event) {
if (closed) {
LogLog.error("Attempted to append to closed appender named [" + name + "].");
return;
}
if (!isAsSevereAsThreshold(event.getLevel())) {
return;
}
Filter f = this.headFilter;
FILTER_LOOP: while (f != null) {
switch (f.decide(event)) {
case Filter.DENY:
return;
case Filter.ACCEPT:
break FILTER_LOOP;
case Filter.NEUTRAL:
f = f.getNext();
}
}
this.append(event);
}
来看看代码流程
1,首先方法是synchronized,所以是线程安全的;
2,判断appender是否已经被关闭了,如果已经关闭,则退出;
3,接着判断当前日志的级别是否低于Appender设置的日志级别,如果是,则退出。通过这代码,我们马上就可以了解到一个新的细节,在Appender上也可以设置每一个Appender自己的日志门槛。这个配置点,在之前的讲解中都没有介绍,但是通过看代码,马上就能了解。这个就是一个最典型的学习过程。我们总是先通过文档或者相关资料了解框架或者工具的大致用法,然后通过查看源代码来掌握更细节的操作。
4,紧接着,如果当前Appender上有Filter,注意一个细节,Filter f = this.headFilter;和f = f.getNext();这两句代码,我们很容易的就可以猜想到,我们可以为Appender添加很多的Filter,而这些Filter又按照添加的关系构成了一个Filter链,在doAppend的过程当中,会按照Filter的处理结果选择退出,跳出,还是继续过滤。
5,最后,调用append方法,真正执行具体的日志输出。而这个append方法:
abstract protected void append(LoggingEvent event);
就是真正子类需要去实现的了。
public abstract class AppenderSkeleton implements Appender, OptionHandler
首先这是个抽象的类,实现了Appender和OptionHandler接口,然后在这个抽象类里面定义了基础的Appender接口中的一些方法,比如怎么添加Filter,怎么添加ErrorHandler,怎么设置名字等,这些代码就忽略,接着看最重要的doAppend()方法:
public synchronized void doAppend(LoggingEvent event) {
if (closed) {
LogLog.error("Attempted to append to closed appender named [" + name + "].");
return;
}
if (!isAsSevereAsThreshold(event.getLevel())) {
return;
}
Filter f = this.headFilter;
FILTER_LOOP: while (f != null) {
switch (f.decide(event)) {
case Filter.DENY:
return;
case Filter.ACCEPT:
break FILTER_LOOP;
case Filter.NEUTRAL:
f = f.getNext();
}
}
this.append(event);
}
来看看代码流程
1,首先方法是synchronized,所以是线程安全的;
2,判断appender是否已经被关闭了,如果已经关闭,则退出;
3,接着判断当前日志的级别是否低于Appender设置的日志级别,如果是,则退出。通过这代码,我们马上就可以了解到一个新的细节,在Appender上也可以设置每一个Appender自己的日志门槛。这个配置点,在之前的讲解中都没有介绍,但是通过看代码,马上就能了解。这个就是一个最典型的学习过程。我们总是先通过文档或者相关资料了解框架或者工具的大致用法,然后通过查看源代码来掌握更细节的操作。
4,紧接着,如果当前Appender上有Filter,注意一个细节,Filter f = this.headFilter;和f = f.getNext();这两句代码,我们很容易的就可以猜想到,我们可以为Appender添加很多的Filter,而这些Filter又按照添加的关系构成了一个Filter链,在doAppend的过程当中,会按照Filter的处理结果选择退出,跳出,还是继续过滤。
5,最后,调用append方法,真正执行具体的日志输出。而这个append方法:
abstract protected void append(LoggingEvent event);
就是真正子类需要去实现的了。