Log4j各级别日志重复打印的问题
来源:互联网 发布:美工刀片哪个牌子好 编辑:程序博客网 时间:2024/05/16 18:33
今天在配置Log4j日志的时候,发现日志重复打印的问题。网上查了很多资料,发现介绍Log4j配置的文章数量不少,但提到这个问题的文章却寥寥,解决了自己的问题以后,赶紧记录一下。
原文地址:http://www.jianshu.com/p/7f0a1121a6df
本文基于log4j 1.2.17版本进行说明
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>
一、问题描述
先来看一下日志配置文件:
#root日志log4j.rootLogger=INFO,stdout,info,warn,error#控制台日志log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %-5p %c{1}:%L - %m%n#info级别日志log4j.appender.info=org.apache.log4j.RollingFileAppenderlog4j.appender.info.Threshold=INFOlog4j.appender.info.File=/home/info.loglog4j.appender.info.MaxFileSize=200MBlog4j.appender.info.MaxBackupIndex=5log4j.appender.info.layout=org.apache.log4j.PatternLayoutlog4j.appender.info.layout.ConversionPattern=%d %-5p %l - %m%n#warn级别日志log4j.appender.warn=org.apache.log4j.RollingFileAppenderlog4j.appender.warn.Threshold=WARNlog4j.appender.warn.File=/home/warn.loglog4j.appender.warn.MaxFileSize=200MBlog4j.appender.warn.MaxBackupIndex=5log4j.appender.warn.layout=org.apache.log4j.PatternLayoutlog4j.appender.warn.layout.ConversionPattern=%d %-5p %l - %m%n#error级别日志log4j.appender.error=org.apache.log4j.RollingFileAppenderlog4j.appender.error.Threshold=ERRORlog4j.appender.error.File=/home/error.loglog4j.appender.error.MaxFileSize=200MBlog4j.appender.error.MaxBackupIndex=5log4j.appender.error.layout=org.apache.log4j.PatternLayoutlog4j.appender.error.layout.ConversionPattern=%d %-5p %l - %m%n
上面这个log4j.properties配置文件是个非常常规的文件,网上大多数讲解Log4j配置信息的文章也都是基于这样一个模板展开的。
使用这套配置,毫无疑问日志是可以正常打印的,但问题就是log4j.appender.info.Threshold指定的级别表示打印等于或者大于这个级别的日志,这样一来当执行下面代码的时候
Logger LOG = LoggerFactory.getLogger(Test.class);LOG.info("info");LOG.warn("warn");LOG.error("error");
我们看到的现象是:
/home/info.log文件中会打印info,warn,error三行日志;
/home/warn.log文件中会打印warn,error两行;
/home/error.log文件中只会打印error一行日志。
上面的结果显然不是我们想要的,因为这样的话相当于info日志中含有所有的日志信息,不但造成冗余,而且也会让warn日志跟error日志显得没有存在的必要。更多的情况下我们希望info日志中只有INFO级别的日志,warn日志中只有WARN级别的日志,同样error日志中也只有ERROR级别的日志。
二、解决办法
这里提供两种解决方案:
1. 重写RollingFileAppender类中的isAsSevereAsThreshold方法。
默认的isAsSevereAsThreshold方法的实现为:
public boolean isAsSevereAsThreshold(Priority priority) { return this.threshold == null || priority.isGreaterOrEqual(this.threshold); }
如果没有设置threshold属性则全部打印,否则打印大于等于threshold属性的日志。
我们继承该类并重写此方法,如下:
public class MyLog4jAppender extends RollingFileAppender { @Override public boolean isAsSevereAsThreshold(Priority priority) { return priority != null && this.getThreshold() != null && priority.isGreaterOrEqual(this.getThreshold()) && this.getThreshold().isGreaterOrEqual(priority); }}
并在log4j.properties文件中修改log4j.appender.info=com.xxx.MyLog4jAppender即可。
- 使用filter进行日志过滤
这个其实是Log4j自带的方案,也是推荐方案,不知道为什么网上的资料却很少提到这点。
把log4j.properties配置文件修改成如下:
#root日志log4j.rootLogger=INFO,stdout,info,warn,error#控制台日志log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %-5p %c{1}:%L - %m%n#info级别日志log4j.appender.info=org.apache.log4j.RollingFileAppenderlog4j.appender.info.Threshold=INFOlog4j.appender.info.File=/home/info.loglog4j.appender.info.MaxFileSize=200MBlog4j.appender.info.MaxBackupIndex=5log4j.appender.info.layout=org.apache.log4j.PatternLayoutlog4j.appender.info.layout.ConversionPattern=%d %-5p %l - %m%nlog4j.appender.info.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilterlog4j.appender.info.filter.infoFilter.LevelMin=INFOlog4j.appender.info.filter.infoFilter.LevelMax=INFO#warn级别日志log4j.appender.warn=org.apache.log4j.RollingFileAppenderlog4j.appender.warn.Threshold=WARNlog4j.appender.warn.File=/home/warn.loglog4j.appender.warn.MaxFileSize=200MBlog4j.appender.warn.MaxBackupIndex=5log4j.appender.warn.layout=org.apache.log4j.PatternLayoutlog4j.appender.warn.layout.ConversionPattern=%d %-5p %l - %m%nlog4j.appender.warn.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilterlog4j.appender.warn.filter.infoFilter.LevelMin=WARNlog4j.appender.warn.filter.infoFilter.LevelMax=WARN#error级别日志log4j.appender.error=org.apache.log4j.RollingFileAppenderlog4j.appender.error.Threshold=ERRORlog4j.appender.error.File=/home/error.loglog4j.appender.error.MaxFileSize=200MBlog4j.appender.error.MaxBackupIndex=5log4j.appender.error.layout=org.apache.log4j.PatternLayoutlog4j.appender.error.layout.ConversionPattern=%d %-5p %l - %m%nlog4j.appender.error.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilterlog4j.appender.error.filter.infoFilter.LevelMin=ERRORlog4j.appender.error.filter.infoFilter.LevelMax=ERROR
通过以上配置模板即可解决各级别日志重复打印的问题。
今天是1024程序员节,兄弟们high起来~
- Log4j各级别日志重复打印的问题
- log4j 日志重复问题
- log4j无法打印日志的问题
- 开发 - log4j打印两次日志的问题
- Log4j 配置不好可能导致你的日志重复打印
- 各级别dpi的值
- 分别输出各级别log日志配置
- log4j日志的5中级别
- log4j日志的5中级别
- Log4j日志记录的相对路径问题与打印HQL
- log4j日志打印的配置
- Weblogic部署项目打印log4j日志问题
- 日志分级别打印
- log4j分级别打印日志+通过socket将日志传输至日志服务器
- log4j分级别打印日志+通过socket将日志传输至日志服务器
- log4j 分级别输出日志
- log4j不打印ibatise的sql日志
- 利用log4j打印sql的log日志
- 倒计时,n秒后跳转
- A Game hiho一下第173周
- Mybatis学习(12)-MyBatis中的二级缓存
- jsp文件编译到java文件
- 第6章 请求和相应对象
- Log4j各级别日志重复打印的问题
- 终端向服务器请求,传值中文出现乱码
- (算法)快速排序
- 用户刷新页面的重复提交数据问题及WEB-INF文件夹相关解析
- POJ1273--Drainage Ditches(最大流)
- 浏览器无法上网的问题:您可能需要与该网络的Internet服务商(isp)签署协议才能获得访问Internet的权限
- HTTP和HTTPS详解。
- 【多线程系列】future模式
- AngularJs路由综合