最近有这样一个需求:

   系统中需要记录业务逻辑(例如:用户行为)上的日志,以备日后分析。记录日志大家会想到log4j,它可以按级别(debug,info,warn,error)记录程序运行中的日志信息,使用很方便。但是,需求中记录的是业务逻辑级别的日志,需要单独记录在一类文件中,而且不希望其他级别日志信息写进来,那么就要对log4j进行扩展。


   思路:首先,增加一个业务逻辑Level级别“BUSINESS”;然后在Logger中增加一个专门记录BUSINESS日志的接口business();之后增加过滤器,使BUSINESS级别日志被识别出来。具体实现如下:


   1、增加Level级别


   public class ExtLevel extends Level{


 public final static int BUSINESS_INT = 1001;

private static final long serialVersionUID = 1L;


protected ExtLevel(int level, String levelStr, int syslogEquivalent) {

super(level, levelStr, syslogEquivalent);


}

public static final Level BUSINESS = new ExtLevel(BUSINESS_INT, "BUSINESS", SyslogAppender.LOG_LOCAL0);

   }

   2、在Logger中增加business()接口


public void business(Object message) {

forcedLog(logger, ExtLevel.BUSINESS, message);

}

   3、扩展Filter类

   新建ExtLogFilter继承自Filter,覆盖decide()方法


   @Override

public int decide(LoggingEvent event) {

int inputLevel = event.getLevel().toInt();

if (inputLevel >= levelMin && inputLevel <= levelMax) {

return Filter.ACCEPT;

}

return Filter.DENY;

}


   4、在log4j.xml中配置

   增加一个 appender 结点:


<appender name="BUSINESS_LOG" class="org.apache.log4j.RollingFileAppender">

<param name="File" value="./logs/my_business.log" />


<layout class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern"

value="[%d{yyyyMMdd HH:mm:ss SSS\} %-5p] [%t] %c{3\} - %m%n" />

</layout>

<filter class="com.xxx.ExtLogFilter">

<param name="LevelMin" value="1001" />

<param name="LevelMax" value="1001" />

</filter>

</appender>


   使用方法:

   ExtLogger logger = ExtLogger.getLogger("xxxx");

   logger.business("…………");


   另外,如果希望ExtLogger也可以记录log4j原有级别的日志,可以在ExtLogger中增加对应的error(),debug()等接口,这样用ExtLogger就能记录所有级别(包括原有级别和扩展级别)的日志了。