log4j的输出是根据*Appender具体实现类输出的,其中主要实现类是FileAppender,DailyRollingFileAppender,RollingFileAppender等,我们现在实现根据日志输出并且按天备份。那么就要改造一下DailyRollingFileAppender类。log4j默认输出自己以及比自己级别高的日志,看源码可以发现:
/**
Check whether the message level is below the appender's
threshold. If there is no threshold set, then the return value is
always <code>true</code>.
*/
public boolean isAsSevereAsThreshold(Priority priority) {
return ((threshold == null) || priority.isGreaterOrEqual(threshold));
}
看上面的代码和我们分析的是一样的,那么我们就把这个方法改造一下,定义一个类继承DailyRollingFileAppender:
public class MyDailyRollingFileAppender extends DailyRollingFileAppender {
@Override
public boolean isAsSevereAsThreshold(Priority priority) {
return this.getThreshold().equals(priority);//只输出相同级别
}
}
这样在配置文件中引用此类即可实现按级别输出。
log4j.appender.Info = MyDailyRollingFileAppender //这里引用
log4j.appender.Info.File = /opt/info.log
log4j.appender.Info.Threshold = INFO
log4j.appender.Info.DatePattern='.'yyyy-MM-dd
log4j.appender.Info.append=true
log4j.appender.Info.layout = org.apache.log4j.PatternLayout
log4j.appender.Info.layout.ConversionPattern =%d [%p] [%20.20t] %20.20c %m%n