我们的项目需要记不同类型,不同格式,不同级别的日志。一般来说很容易想到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("严重错误!"); ...... |
|