log4j定制类实现(二):添加模块名配置

来源:互联网 发布:msdn win7 优化 编辑:程序博客网 时间:2024/05/21 19:26

   在前面讲到了log4j定时打印的定制类实现,就不讲指定大小和指定备份文件个数了,从RollingFileAppender类copy代码到前面的定制类中添加即可,唯一需要解决的是并发问题,即文件关闭rename文件时,发生了记录日志事件时,会报output stream closed的错误。

    现在有这样一种应用场景,而且经常有:

    1.项目包含有多个不同的工程;

    2.同一工程包含不同的模块。

    对第一种情况,可以通过配置log4j<catogery=“Test”>,再在产生Logger时使用类似如下方式:

Logger logger=Logger.getLogger("Test");

    对第二种情况,我们希望能够将不同模块打印到同一个日志文件中,不过希望能够在日志中打印出模块名以便出问题时定位问题,因此便有了本文需要的在Appender类中添加配置ModuleName,下面开始改造,与定时打印不同,我们采用RollingFileAppender类为基类进行改造。

    首先,添加配置项moduleName,并增加get、set方法;

    由于继承自RollingFileAppender,所以只需要在subAppend()中格式化LoggingEvent中的数据,添加formatInfo方法格式化数据,代码略;

    最终的成品类如下:

package net.csdn.blog;import org.apache.log4j.Category;import org.apache.log4j.RollingFileAppender;import org.apache.log4j.spi.LoggingEvent;/** * @author coder_xia *  */public class ModuleAppender extends RollingFileAppender{private String moduleName;/** * @return the moduleName */public String getModuleName(){return moduleName;}/** * @param moduleName *            the moduleName to set */public void setModuleName(String moduleName){this.moduleName = moduleName;}/** * 格式化打印内容 *  * @param event *            event * @return msg */private String formatInfo(LoggingEvent event){StringBuilder sb = new StringBuilder();if (moduleName != null){sb.append(moduleName).append("|");sb.append(event.getMessage());}return sb.toString();}@Overridepublic void subAppend(LoggingEvent event){String msg = formatInfo(event);super.subAppend(new LoggingEvent(Category.class.getName(), event.getLogger(), event.getLevel(), msg, null));}}


 

原创粉丝点击