接下来,我们来看看最简单的WriterAppender的实现,很简单,我们要查看WriterAppender,其实就只需要关注append方法的实现和activiteOption方法了。
首先WriterAppender类实现了AppenderSkeleton,但是这个类在activiteOption方法中并没有做任何事情,那我们的重点就放在append方法上了:
public void append(LoggingEvent event) {
if(!checkEntryConditions()) {
return;
}
subAppend(event);
}
首先,checkEntryConditions方法对一些Appender可能存在的异常做了一些简单的判断,比如Appender不能关闭,Appender必须有一个Layout对象等等,然后把真正的日志输出交给了subAppend方法,我们来看看这个方法:
protected void subAppend(LoggingEvent event) {
this.qw.write(this.layout.format(event));
if (layout.ignoresThrowable()) {
String[] s = event.getThrowableStrRep();
if (s != null) {
int len = s.length;
for (int i = 0; i < len; i++) {
this.qw.write(s[i]);
this.qw.write(Layout.LINE_SEP);
}
}
}
if (shouldFlush(event)) {
this.qw.flush();
}
}
使用qw直接输出layout格式化完成的LoggingEvent。我们前面已经说到,layout把loggingEvent对象格式化成String,然后交给这个qw输出,那么这个qw又是什么呢?我们继续看代码:
public synchronized void setWriter(Writer writer) {
reset();
this.qw = new QuietWriter(writer, errorHandler);
writeHeader();
}
前面我们在使用WriterAppender的时候就已经知道WriterAppender需要提供一个Writer对象,这里就是将我们传入的writer对象直接包装成一个QuiteWriter。那什么是QuiteWriter呢?很简单,QuiteWriter当遇到错误的时候,不会对外抛出任何错误,而是把在写入过程中遇到的错误,交给ErrorHandler去处理。
最后,如果应该刷新,即前面提到过的immediateFlush属性设置为true,那么在每次写完内容之后,直接调用writer的flush方法。
整个WriterAppender的方法实现是非常简单明了的,因为Log4J本身来说是一个很简单的工具,特别是我们对Java有一定了解,也写过2,3年代码之后,想要对自己的技术水平有一个提高的时候,经常的去阅读我们常常使用到的框架的源代码对我们是非常有用的。但是假如你直接去阅读Spring或者Hibernate的代码时,又会比较难,那么Log4J,MyBatis这些框架就是很好的入门。
首先WriterAppender类实现了AppenderSkeleton,但是这个类在activiteOption方法中并没有做任何事情,那我们的重点就放在append方法上了:
public void append(LoggingEvent event) {
if(!checkEntryConditions()) {
return;
}
subAppend(event);
}
首先,checkEntryConditions方法对一些Appender可能存在的异常做了一些简单的判断,比如Appender不能关闭,Appender必须有一个Layout对象等等,然后把真正的日志输出交给了subAppend方法,我们来看看这个方法:
protected void subAppend(LoggingEvent event) {
this.qw.write(this.layout.format(event));
if (layout.ignoresThrowable()) {
String[] s = event.getThrowableStrRep();
if (s != null) {
int len = s.length;
for (int i = 0; i < len; i++) {
this.qw.write(s[i]);
this.qw.write(Layout.LINE_SEP);
}
}
}
if (shouldFlush(event)) {
this.qw.flush();
}
}
使用qw直接输出layout格式化完成的LoggingEvent。我们前面已经说到,layout把loggingEvent对象格式化成String,然后交给这个qw输出,那么这个qw又是什么呢?我们继续看代码:
public synchronized void setWriter(Writer writer) {
reset();
this.qw = new QuietWriter(writer, errorHandler);
writeHeader();
}
前面我们在使用WriterAppender的时候就已经知道WriterAppender需要提供一个Writer对象,这里就是将我们传入的writer对象直接包装成一个QuiteWriter。那什么是QuiteWriter呢?很简单,QuiteWriter当遇到错误的时候,不会对外抛出任何错误,而是把在写入过程中遇到的错误,交给ErrorHandler去处理。
最后,如果应该刷新,即前面提到过的immediateFlush属性设置为true,那么在每次写完内容之后,直接调用writer的flush方法。
整个WriterAppender的方法实现是非常简单明了的,因为Log4J本身来说是一个很简单的工具,特别是我们对Java有一定了解,也写过2,3年代码之后,想要对自己的技术水平有一个提高的时候,经常的去阅读我们常常使用到的框架的源代码对我们是非常有用的。但是假如你直接去阅读Spring或者Hibernate的代码时,又会比较难,那么Log4J,MyBatis这些框架就是很好的入门。