读书人

Log4J日记分级应用

发布时间: 2012-10-12 10:17:04 作者: rapoo

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配置项

Log4J日记分级应用?

新Logger的应用(如在kernel中)

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配置信息——其目的和原理是一样的。


Log4J日记分级应用
?注意黄色高亮的部分。

?

?

——结束

读书人网 >编程

热点推荐