我们的项目需要记不同类型,不同格式,不同级别的日志。一般来说很容易想到Log4j,的确用它来写日志很方便,但是我们的项目对日志的需求有一点超出了它本身的处理能力:log4j只有debug,info,warn,error四种级别定义,而我们的日志不只这四类,还有serious,checkout等,如果直接用log4j的log.debug(),log.warn()....是不会写诸如
serious:XXXX:20060708
checkout:xxxxx:20060708这种形式的日志内容的
看了看资料,log4j的日志级别是通过Level类来实现的,log.warn(Object)实际调用的logger.log(Level,Object)方法
这样就好办了,写一个类继承Log4j的Level类,扩充其日志级别,然后封装log4j的logger类,在封装的类中调用logger.log(扩充的Level类,Object)就可以了,具体步骤如下:
1:写一个类继承Level,override父类的构造函数,比如我们需要Serious级别
private static class SeriousLevel extends Level {
private SeriousLevel(int level, String name, int sysLogLevel) {
super(level, name, sysLogLevel);
}
}
2:把这些继承Level的子类归到一个接口中,便于统一调用
public interface MyLogLevel
{
public static final Level SERIOUS_LEVEL = new SeriousLevel(Priority.ERROR_INT, "SERIOUS", SyslogAppender.LOG_LOCAL0);
public static final Level ALARM_LEVEL = new AlarmLevel(Priority.DEBUG_INT + 50, "ALARM", SyslogAppender.LOG_LOCAL0);
......
}
Priority.ERROR_INT是log4j的级别定义,通过这个我们可以定义自己的级别的大小,比如上述ALARM_LEVEL就比SERIOUS_LEVEL日志级别要高50点
3:封装Log4j的Logger,新增serious(Object) alarm(Object)等方法,在方法中调用Logger.log(Level,Object)来传入我们自己的日志level
public class MyLogger{
private Logger log ;
.......
public void serious(Object pm_objLogInfo)
{
log.loger(MyLogLevel.SERIOUS_LEVEL,pm_objLogInfo);
/*MyLogLevel接口中的所有自定义日志级别都继承自Level*/
}
public void serious(Object pm_objLogInfo)
{
log.loger(MyLogLevel.ALARM_LEVEL,pm_objLogInfo);
}
......
}
4:ok!这就搞定了,Log4j新增了Serious,Alarm等级别,在你的log4j.conf(or log4j.property)配置你需要的日志级别,然后在你的写日志的代码中如此调用即可:
.....
Mylogger loger = new MyLogger();
loger.serious("严重错误!");
......