在实际项目开发中有时候我们需要把不同等级的日志信息记录在不同的文件内,例如:希望等级为INFO的日志保存在一个文件中,而等级为ERROR的日志保存在另外一个文件中。这样一旦项目某个功能出了问题我们就可以只看保存ERROR日志信息的文件即可。

  这时,Log4j中自带的文件生成策略类型就不能够满足我们的要求,我们需要自己写一个类来继承相关相关类并覆盖相应方法即可,下面以DailyRollingFileAppender为例:

log4j.properties

log4j.rootLogger=INFO,stdout,infoTarget,errorTarget

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}|%p|%C|%M|%L|%m%n

log4j.appender.infoTarget=com.zws.log.MyDailyRollingFileAppender
log4j.appender.infoTarget.layout=org.apache.log4j.PatternLayout
log4j.appender.infoTarget.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}|%p|%C|%M|%L|%m%n
log4j.appender.infoTarget.datePattern='.'yyyy-MM-dd
log4j.appender.infoTarget.Threshold = INFO
log4j.appender.infoTarget.append=true
log4j.appender.infoTarget.File=${catalina.home}/logs/app/itc/info.log

log4j.appender.errorTarget=com.zws.log.MyDailyRollingFileAppender
log4j.appender.errorTarget.layout=org.apache.log4j.PatternLayout  
log4j.appender.errorTarget.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss}|%p|%C|%M|%L|%m%n
log4j.appender.errorTarget.datePattern='.'yyyy-MM-dd
log4j.appender.errorTarget.Threshold = ERROR
log4j.appender.errorTarget.append=true
log4j.appender.errorTarget.File=${catalina.home}/logs/app/error.log

MyDailyRollingFileAppender.java

package com.zws.log;

import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Priority;
/**
 * 等级为ERROR的日志单独在一个文件里面
 * @author wensh.zhu
 *
 */
public class MyDailyRollingFileAppender extends DailyRollingFileAppender {
	@Override
	public boolean isAsSevereAsThreshold(Priority priority) {
		String level = priority.toString();
		if (level.equalsIgnoreCase("ERROR")) {
		        //this.getThreshold()即为配置文件中Threshold属性
			return this.getThreshold().equals(priority);
		}
		return super.isAsSevereAsThreshold(priority);
	}
}

  这里有两个需要注意的地方,第一个地方是在log4j.properties文件中log4j.appender.infoTarget.Threshold属性一定要指定,属性值为等级(INFO,ERROR等),后面需要用到此属性进行判断是否要写入文件,第二个个地方是类MyDailyRollingFileAppender继承了DailyRollingFileAppender并重写了isAsSevereAsThreshold方法,此方法决定等级为Threshold属性值的日志信息是否要写入日志。本例中当调用error方法写入错误日志的时候,此日志信息写入到Threshold属性值为ERROR的目的地文件中,即${catalina.home}/logs/app/error.log文件。