Log4J学习【三十三】错误处理之ErrorHandler

来源:互联网 发布:windows sdk 8.1下载 编辑:程序博客网 时间:2024/04/28 05:22
上一章讲的除了三个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的实现方式。
0 0
原创粉丝点击