这两天在分析系统debug日志是如何输出到文件的,发现日志有重复打印的问题。info日志中有info,warn
,error级别的日志,这样显然是不合理的。 原因是因为:LOG4J.APPENDER.D.THRESHOLD 表示打印大于、等于该级别的日志,由于ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF,所以warn、error级别日志在info中也打印了出来
上面的结果显然不是我们想要的,因为这样的话相当于info日志中含有所有的日志信息,不但造成冗余,而且也会让warn日志跟error日志显得没有存在的必要。更多的情况下我们希望info日志中只有INFO级别的日志,warn日志中只有WARN级别的日志,同样error日志中也只有ERROR级别的日志。
文件依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
@Test
public void testLog(){
Logger logger = Logger.getLogger(test.class);
logger.debug("debug,我来了");
logger.info("info ,我来了");
logger.warn("warn,我来了");
logger.error("error,我来了");
// try {
// int i = 1 / 0;
// }catch (Exception e){
// logger.error(e.getMessage(),e);
// }
}
log4j.properties配置
##配置根路径,方便统一管理,输出日志会引用该地址
log4j.root=D:/loger
##配置输出日志等级以及输出日志别名,rootLogger是新的使用名称,对应Logger类
##rootCategory是旧的使用名称,对应原来的Category类,Logger类是Category类的子类,所以,rootCategory是旧的用法,不推荐使用
log4j.rootLogger=debug,stdout,debuglog,infolog,warnlog,errorlog
##配置输出日志打印到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n
##配置debug日志输出到debuglog文件
log4j.appender.debuglog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.debuglog.Threshold = DEBUG
log4j.appender.debuglog.File = ${log4j.root}/logs/logtest/debuglog.log
log4j.appender.debuglog.layout = org.apache.log4j.PatternLayout
log4j.appender.debuglog.layout.ConversionPattern = [%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n
log4j.appender.debuglog.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter
log4j.appender.debuglog.filter.infoFilter.LevelMin = DEBUG
log4j.appender.debuglog.filter.infoFilter.LevelMax = DEBUG
##配置info信息输出到infolog文件
log4j.appender.infolog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.infolog.Threshold = INFO
log4j.appender.infolog.File = ${log4j.root}/logs/logtest/infolog.log
log4j.appender.infolog.layout = org.apache.log4j.PatternLayout
log4j.appender.infolog.layout.ConversionPattern = [%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n
log4j.appender.infolog.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter
log4j.appender.infolog.filter.infoFilter.LevelMin = INFO
log4j.appender.infolog.filter.infoFilter.LevelMax = INFO
##配置warn信息输出到test_warn文件
log4j.appender.warnlog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.warnlog.Threshold = WARN
log4j.appender.warnlog.File = ${log4j.root}/logs/logtest/test_warn.log
log4j.appender.warnlog.layout = org.apache.log4j.PatternLayout
log4j.appender.warnlog.layout.ConversionPattern = [%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n
log4j.appender.warnlog.filter.warnFilter = org.apache.log4j.varia.LevelRangeFilter
log4j.appender.warnlog.filter.warnFilter.LevelMin = WARN
log4j.appender.warnlog.filter.warnFilter.LevelMax=WARN
##配置warn信息输出到test_error文件,此处就不用加过滤器了
log4j.appender.errorlog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorlog.Threshold = ERROR
log4j.appender.errorlog.File = ${log4j.root}/logs/logtest/test_error.log
log4j.appender.errorlog.layout = org.apache.log4j.PatternLayout
log4j.appender.errorlog.layout.ConversionPattern = [%d{MM-dd HH:mm:ss}] [%p] [%c:%L] %m%n