您的位置:首页 > 移动开发

Log4J学习【二十四】常用的Appender的使用一

2014-12-17 15:10 429 查看
下面,我们来看看到底这些Appender是怎么运行的,他们的结构是怎样,代码是怎样的。学习了这些,我们就可以更轻松的使用SMTPAppender这些我们不了解的Appender,更重要的是,我们完全可以很轻松的自定义我们想要的Appender了。

首先先来看看我们已经学习的几个Appender的继承体系结构:



首先要介绍的是两个非常重要的接口,Appender和OptionHandler。Appender接口不用多说,是所有Appender的总接口,而OptionHandler是用来处理Appender的参数设置接口。先来看看OptionHandler的签名:

public interface OptionHandler {

void activateOptions();

}

在这个接口中只有一个方法activateOptions(),这个方法的意思可以理解为afterPropertySetting()。一个很简单的例子,比如当我们在使用FileAppender的时候,我们需要为FileAppender设置其对应的file参数,然后就需要根据设置的file参数的值去创建真正的文件用来记录日志。那这个文件什么时候创建呢?换句话说,应该在所有的参数都设置完毕后,有一个钩子方法去告诉我的Appender,所有的参数已经设置完毕,可以开始自己的初始化操作了。这个activateOptions方法就是起到了这个钩子方法的作用。理解了这个接口,我们就很容易开始猜想,在FileAppender中,这个方法里面会去创建对应的文件;在SocketAppender中,这个方法里面会去创建Socket等等。

OptionHandler这个接口如果仅仅是一个标识接口的话,那么Appender接口就是整个Log4J里面最重要的接口了。

public interface Appender {

void addFilter(Filter newFilter);

public Filter getFilter();

public void clearFilters();

public void close();

public void doAppend(LoggingEvent event);

public String getName();

public void setName(String name);

public void setErrorHandler(ErrorHandler errorHandler);

public ErrorHandler getErrorHandler();

public void setLayout(Layout layout);

public Layout getLayout();

public boolean requiresLayout();

}

我们慢慢来看这个接口中的方法。

首先是和Filter相关的add/get/clear,关于Filter,我们待会再来介绍,这里我们只需要从名字上面理解,这个是一种过滤器,结合Servlet规范中的Filter,我们知道,这里的filter肯定也能对LoggingEvent做一些过滤操作。

接着是close方法,不用多说,当Log环境结束后,会使用close方法来关闭Appender关联的资源。

下面就是Log4J中最重要的方法,没有之一:doAppend。是的,所有的日志请求都是通过这个方法按照某种样式输出到目的地。这个方法传入一个LoggingEvent,这个对象前面已经见过不少了,就是代表日志请求。

接下来是getName/setName方法,我们知道Appender都是有名字的实体,这点在properties或者xml配置文件中体现的很明显,这两个方法就是appender对应名字的getter和setter。

接下来是setErrorHandler和getErrorHandler。这是很明显的一对getter/setter,对应的对象是ErrorHandler,关于ErrorHandler,后面还会介绍,这里也先从字面上理解,即错误处理器,意思很明显,当Appender在合成日志的时候如果发生了错误,会按照怎样的逻辑去处理错误。

最后,是三个和layout相关的方法,addLayout和getLayout我们不说了,即是Appender对应的Layout的getter/setter,最后一个requiresLayout方法,这个也是个很重要的方法。前面在看Appender的时候我们已经注意到,不是所有的Appender都必须有一个Layout和其对应,比如socketAppender,就不需要任何的Layout。这个requiresLayout即是需要Appender的实现类来返回一个boolean,表明这个Appender是否需要一个Lyaout。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: