上一章讲的除了三个error方法,可能另外的三个方法还是稍微有些难以理解,我们先来看看Log4J为我们提供的ErrorHandler。
默认情况下,每一个Appender都对应一个默认的ErrorHandler,叫做OnlyOnceErrorHandler,这个errorHandler是在AppenderSkeleton中定义的:
protected ErrorHandler errorHandler = new OnlyOnceErrorHandler();
这个ErrorHandler会干什么呢?我们来做一个测试:
log4j.rootLogger=DEBUG,file
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.file=log.log
log4j.appender.file.layout=org.apache.log4j.SimpleLayout
创建一个FileAppender,日志文件名称为log.log。然后我们在文件目录下创建一个log.log文件,然后设置文件属性为只读。创建一个测试案例:
@Test
public void testOnlyOnceErrorHandler(){
Logger logger=Logger.getLogger("cd.itcast");
logger.warn("logger warn");
logger.warn("logger warn");
logger.warn("logger warn");
}
在测试中,我们连续记录三条日志,运行测试:
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: log.log (拒绝访问。)
观察控制台中的输出,首先,使用log4j:ERROR输出了一次错误,这个错误就是OnlyOnceErrorHandler打印的;其次,只打印了一次错误,这个就是onlyonce的意思。其实每次做日志,都会尝试向log.log文件中添加日志内容,但因为是Onlyonce,所以,只会把第一次出错打印。看到了OnlyOnceErrorHandler的表现形式之后,我们来看看他的代码:
public void error(String message, Exception e, int errorCode, LoggingEvent event) {
if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
Thread.currentThread().interrupt();
}
if (firstTime) {
LogLog.error(message, e);
firstTime = false;
}
}
在这个类里面,就只实现了error方法,在这个方法中,首先记录是否是第一次出错,如果是第一次出错,就直接打印错误。这个OnlyOnceErrorHandler在配置上没有任何代表性,他只是很简单的给了我们一个ErrorHandler的实现方式。
默认情况下,每一个Appender都对应一个默认的ErrorHandler,叫做OnlyOnceErrorHandler,这个errorHandler是在AppenderSkeleton中定义的:
protected ErrorHandler errorHandler = new OnlyOnceErrorHandler();
这个ErrorHandler会干什么呢?我们来做一个测试:
log4j.rootLogger=DEBUG,file
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.file=log.log
log4j.appender.file.layout=org.apache.log4j.SimpleLayout
创建一个FileAppender,日志文件名称为log.log。然后我们在文件目录下创建一个log.log文件,然后设置文件属性为只读。创建一个测试案例:
@Test
public void testOnlyOnceErrorHandler(){
Logger logger=Logger.getLogger("cd.itcast");
logger.warn("logger warn");
logger.warn("logger warn");
logger.warn("logger warn");
}
在测试中,我们连续记录三条日志,运行测试:
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: log.log (拒绝访问。)
观察控制台中的输出,首先,使用log4j:ERROR输出了一次错误,这个错误就是OnlyOnceErrorHandler打印的;其次,只打印了一次错误,这个就是onlyonce的意思。其实每次做日志,都会尝试向log.log文件中添加日志内容,但因为是Onlyonce,所以,只会把第一次出错打印。看到了OnlyOnceErrorHandler的表现形式之后,我们来看看他的代码:
public void error(String message, Exception e, int errorCode, LoggingEvent event) {
if (e instanceof InterruptedIOException || e instanceof InterruptedException) {
Thread.currentThread().interrupt();
}
if (firstTime) {
LogLog.error(message, e);
firstTime = false;
}
}
在这个类里面,就只实现了error方法,在这个方法中,首先记录是否是第一次出错,如果是第一次出错,就直接打印错误。这个OnlyOnceErrorHandler在配置上没有任何代表性,他只是很简单的给了我们一个ErrorHandler的实现方式。