在前面讲到了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();
}
@Override
public void subAppend(LoggingEvent event)
{
String msg = formatInfo(event);
super.subAppend(new LoggingEvent(Category.class.getName(), event
.getLogger(), event.getLevel(), msg, null));
}
}