文章

log4j自定义appender实现,处理异常堆栈

在项目中需要自定义实现一个log4j的appender。根据log中MDC里的信息,构造日志存储的目录结构。自定义实现log4j appender的方法已经介绍过了。主要是覆盖AppenderSkeleton中的appender方法。

1
2
3
4
@Override
      protected void append(LoggingEvent event) {
           this .logEvent = event;
     }

日志内容的获取和格式处理,通过Layout进行格式化

1
this .getLayout().format(event).getBytes( DEFAULT_CS )

这里有个问题,一般情况下,我们常用的org.apache.log4j.PatternLayout是不会处理异常堆栈的。因为,其内部的方法,返回的是true。

1
2
3
public  boolean ignoresThrowable () {
    return true ;
  }

在这种情况,如果你的日志里有异常对象,如logger.error(“错误信息。”, e) 那么e将会被忽略。这时候需要我们自己处理。处理方式如下:

1
2
3
4
5
6
7
if (layout .ignoresThrowable()) {
      String[] s = event.getThrowableStrRep();
      if (s != null ) {
      int len = s. length;
      for( int i = 0; i < len; i++) {
           // 处理异常堆栈,比如记录到日志文件中
     }
本文由作者按照 CC BY 4.0 进行授权