Log4J学习【二十六】常用的Appender的使用三

本文详细解析了WriterAppender的核心方法append和subAppend的实现逻辑,包括异常处理、日志输出流程以及WriterAppender如何通过QuietWriter封装Writer对象来避免错误抛出。此外,还介绍了WriterAppender的配置和使用方式,帮助开发者更好地理解和利用这一Log4J组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接下来,我们来看看最简单的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这些框架就是很好的入门。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值