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

   在前面讲到了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));
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值