Log4J日志分级应用
本文主要讲述一个日志分级应用的模型和如何利以及扩展Log4J来达到目的,关于Log4J的配置说明和基础应用就不再累述,详情可参见官方文档http://logging.apache.org/log4j/1.2/manual.html
/** Call the appenders in the hierrachy starting at <code>this</code>. If no appenders could be found, emit a warning. <p>This method calls all the appenders inherited from the hierarchy circumventing any evaluation of whether to log or not to log the particular log request. @param event the event to log. */ public void callAppenders(LoggingEvent event) { int writes = 0; for(Category c = this; c != null; c=c.parent) { // Protected against simultaneous call to addAppender, removeAppender,... synchronized(c) {if(c.aai != null) { writes += c.aai.appendLoopOnAppenders(event);}if(!c.additive) { break;} } } if(writes == 0) { repository.emitNoAppenderWarning(this); } }?
我们最终的目的就是阻止其输出日志后还继续上溯输出,因此需做如下修改:
if(c.aai != null) { writes += c.aai.appendLoopOnAppenders(event); break;}?
package com.xxx.casespublic class DefaultLoggerFactory implements org.apache.log4j.spi.LoggerFactory { public DefaultLoggerFactory() { } public Logger makeNewLoggerInstance(String name) { return new Logger(name); }}
?
package com.xxx.cases;import org.apache.log4j.Appender;import org.apache.log4j.helpers.AppenderAttachableImpl;import org.apache.log4j.spi.LoggingEvent;public class Logger extends org.apache.log4j.Logger{ private static final DefaultLoggerFactory defaultFactory = new DefaultLoggerFactory(); private AppenderAttachableImpl aai; protected Logger(String name) { super(name); } @Override public void callAppenders(LoggingEvent event) { if (this.aai == null && !(this.getParent() instanceof Logger)) { super.callAppenders(event); } else { int writes = 0; for (Logger c = this; c != null; c = (Logger) c.getParent()) { // Protected against simultaneous call to addAppender, removeAppender,... synchronized (c) { if (c.aai != null) { writes += c.aai.appendLoopOnAppenders(event); break; } if (!c.getAdditivity()) { break; } } } if (writes == 0) { repository.emitNoAppenderWarning(this); } } } public synchronized void addAppender(Appender newAppender) { if (aai == null) { aai = new AppenderAttachableImpl(); } aai.addAppender(newAppender); repository.fireAddAppenderEvent(this, newAppender); } public static Logger getLogger(Class clazz){ return (Logger)org.apache.log4j.Logger.getLogger(clazz.getName(), defaultFactory); }}修改log4j.properties配置文件,增加loggerFactory配置项
?
package com.xxx.cases.kernel;import com.xxx.cases.Logger;public class KernelBean { private static Logger logger = Logger.getLogger(KernelBean.class); public void testMethod(){ logger.info("in kernel bean test method"); }}
?
后记:经朋友提醒,还有一种更加简便的方式,只需要修改log4.properties配置信息——其目的和原理是一样的。
?注意黄色高亮的部分。
?
?
——结束