最近有这样一个需求:
系统中需要记录业务逻辑(例如:用户行为)上的日志,以备日后分析。记录日志大家会想到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就能记录所有级别(包括原有级别和扩展级别)的日志了。