Log4j支持自定义输出。所有输出都是实现自Appender接口。一般来说,自定义输出只需要继承AppenderSkeleton类,并实现几个方法就可以了。
看一个自定义输出的例子。CountingConsoleAppender跟控制台输出类似,不同的是会统计日志输出的次数。当输出次数超过预定的值时,会做相应的业务处理(这里为打印一行提示信息),并停止输出,代码如下。
1 import org.apache.log4j.AppenderSkeleton; 2 import org.apache.log4j.spi.ErrorCode; 3 import org.apache.log4j.spi.LoggingEvent; 4 5 public class CountingConsoleAppender extends AppenderSkeleton { 6 int count = 0;// 记录日志的次数 7 int limit = 16;// 权限次数 8 9 public void setLimit(int limit) {// setter方法 10 this.limit = limit; 11 } 12 13 public int getLimit() {// getter方法 14 return limit; 15 } 16 17 @Override 18 public void close() { 19 if (this.closed)// 如果被关掉了 20 return; 21 this.closed = true; 22 } 23 24 @Override 25 public boolean requiresLayout() {// 需要使用布局 26 return true; 27 } 28 29 @Override 30 protected void append(LoggingEvent event) { 31 if (this.layout == null) { 32 // 没有设置出布局 33 errorHandler.error("没有设置[" + name + "]输出布局.", null, 34 ErrorCode.MISSING_LAYOUT); 35 return; 36 } 37 if (count >= limit) { 38 errorHandler.error("输出次数[" + limit + "]达到了[" + getName() + "]的极限", 39 null, ErrorCode.WRITE_FAILURE); 40 return; 41 } 42 System.out.println(this.layout.format(event)); 43 if (layout.ignoresThrowable()) { 44 String[] t = event.getThrowableStrRep(); 45 if (t != null) { 46 int len = t.length; 47 for (int i = 0; i < len; i++) { 48 System.out.println(t[i]); 49 } 50 } 51 } 52 count++;// 继续下次日志 53 } 54 55 }
其中最大输出次数可以在log4j.properties中配置。配置代码如下:
1 log4j.rootLogger= DEBUG, COUNTING 2 3 log4j.appender.COUNTING=com.log4j.test.CountingConsoleAppender 4 5 #输出10次停止 6 log4j.appender.COUNTING.limit=10 7 log4j.appender.COUNTING.layout=org.apache.log4j.PatternLayout 8 log4j.appender.COUTIING.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss,SSS} [%C]-[%p] %m%n
设定输出次数为10.当输出超过10次后,该自定义Appender会输出下面的信息,并停止输出:
1 log4j:ERROR 输出次数[10]达到了[COUNTING]的极限