摘要:今天在配置日志的時候,發(fā)現(xiàn)日志重復(fù)打印的問題。把配置文件修改成如下日志控制臺日志級別日志級別日志級別日志通過以上配置模板即可解決各級別日志重復(fù)打印的問題。
今天在配置Log4j日志的時候,發(fā)現(xiàn)日志重復(fù)打印的問題。網(wǎng)上查了很多資料,發(fā)現(xiàn)介紹Log4j配置的文章數(shù)量不少,但提到這個問題的文章卻寥寥,解決了自己的問題以后,趕緊記錄一下。
原文地址:http://www.jianshu.com/p/7f0a...
本文基于log4j 1.2.17版本進行說明
一、問題描述log4j log4j 1.2.17
先來看一下日志配置文件:
#root日志 log4j.rootLogger=INFO,stdout,info,warn,error #控制臺日志 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 %-5p %c{1}:%L - %m%n #info級別日志 log4j.appender.info=org.apache.log4j.RollingFileAppender log4j.appender.info.Threshold=INFO log4j.appender.info.File=/home/info.log log4j.appender.info.MaxFileSize=200MB log4j.appender.info.MaxBackupIndex=5 log4j.appender.info.layout=org.apache.log4j.PatternLayout log4j.appender.info.layout.ConversionPattern=%d %-5p %l - %m%n #warn級別日志 log4j.appender.warn=org.apache.log4j.RollingFileAppender log4j.appender.warn.Threshold=WARN log4j.appender.warn.File=/home/warn.log log4j.appender.warn.MaxFileSize=200MB log4j.appender.warn.MaxBackupIndex=5 log4j.appender.warn.layout=org.apache.log4j.PatternLayout log4j.appender.warn.layout.ConversionPattern=%d %-5p %l - %m%n #error級別日志 log4j.appender.error=org.apache.log4j.RollingFileAppender log4j.appender.error.Threshold=ERROR log4j.appender.error.File=/home/error.log log4j.appender.error.MaxFileSize=200MB log4j.appender.error.MaxBackupIndex=5 log4j.appender.error.layout=org.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern=%d %-5p %l - %m%n
上面這個log4j.properties配置文件是個非常常規(guī)的文件,網(wǎng)上大多數(shù)講解Log4j配置信息的文章也都是基于這樣一個模板展開的。
使用這套配置,毫無疑問日志是可以正常打印的,但問題就是log4j.appender.info.Threshold指定的級別表示打印等于或者大于這個級別的日志,這樣一來當執(zhí)行下面代碼的時候
Logger LOG = LoggerFactory.getLogger(Test.class); LOG.info("info"); LOG.warn("warn"); LOG.error("error");
我們看到的現(xiàn)象是:
/home/info.log文件中會打印info,warn,error三行日志;
/home/warn.log文件中會打印warn,error兩行;
/home/error.log文件中只會打印error一行日志。
上面的結(jié)果顯然不是我們想要的,因為這樣的話相當于info日志中含有所有的日志信息,不但造成冗余,而且也會讓warn日志跟error日志顯得沒有存在的必要。更多的情況下我們希望info日志中只有INFO級別的日志,warn日志中只有WARN級別的日志,同樣error日志中也只有ERROR級別的日志。
二、解決辦法這里提供兩種解決方案:
重寫RollingFileAppender類中的isAsSevereAsThreshold方法。
默認的isAsSevereAsThreshold方法的實現(xiàn)為:
public boolean isAsSevereAsThreshold(Priority priority) { return this.threshold == null || priority.isGreaterOrEqual(this.threshold); }
如果沒有設(shè)置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自帶的方案,也是推薦方案,不知道為什么網(wǎng)上的資料卻很少提到這點。
把log4j.properties配置文件修改成如下:
#root日志 log4j.rootLogger=INFO,stdout,info,warn,error #控制臺日志 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 %-5p %c{1}:%L - %m%n #info級別日志 log4j.appender.info=org.apache.log4j.RollingFileAppender log4j.appender.info.Threshold=INFO log4j.appender.info.File=/home/info.log log4j.appender.info.MaxFileSize=200MB log4j.appender.info.MaxBackupIndex=5 log4j.appender.info.layout=org.apache.log4j.PatternLayout log4j.appender.info.layout.ConversionPattern=%d %-5p %l - %m%n log4j.appender.info.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter log4j.appender.info.filter.infoFilter.LevelMin=INFO log4j.appender.info.filter.infoFilter.LevelMax=INFO #warn級別日志 log4j.appender.warn=org.apache.log4j.RollingFileAppender log4j.appender.warn.Threshold=WARN log4j.appender.warn.File=/home/warn.log log4j.appender.warn.MaxFileSize=200MB log4j.appender.warn.MaxBackupIndex=5 log4j.appender.warn.layout=org.apache.log4j.PatternLayout log4j.appender.warn.layout.ConversionPattern=%d %-5p %l - %m%n log4j.appender.warn.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter log4j.appender.warn.filter.infoFilter.LevelMin=WARN log4j.appender.warn.filter.infoFilter.LevelMax=WARN #error級別日志 log4j.appender.error=org.apache.log4j.RollingFileAppender log4j.appender.error.Threshold=ERROR log4j.appender.error.File=/home/error.log log4j.appender.error.MaxFileSize=200MB log4j.appender.error.MaxBackupIndex=5 log4j.appender.error.layout=org.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern=%d %-5p %l - %m%n log4j.appender.error.filter.infoFilter = org.apache.log4j.varia.LevelRangeFilter log4j.appender.error.filter.infoFilter.LevelMin=ERROR log4j.appender.error.filter.infoFilter.LevelMax=ERROR
通過以上配置模板即可解決各級別日志重復(fù)打印的問題。
今天是1024程序員節(jié),兄弟們high起來~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67863.html
摘要:深入學習系列三那些年我們用過的日志框架目前常見的日志框架和中文似乎不太好翻譯有一下幾種即其中,為同一個作者所寫。如前面所述,在才被引入,在這之前,并沒有官方的日志庫供開發(fā)者使用。 title: 【Java深入學習系列】三. 那些年我們用過的日志框架date: 2016-10-16 15:32:50 category: java 目前常見的Java日志框架和facades(中文似乎不太好...
摘要:的測試完全不同級別的。記錄請求的級別在高于或等于其的有效級別時被稱為被啟用,否則,稱為被禁用。該規(guī)則是的核心。指定名稱,指定的全限定名。對記錄事件進行格式化。查看當前活動文件的大小,如果超過指定大小會告知觸發(fā)當前活動文件滾動。 一、logback的介紹 Logback是由log4j創(chuàng)始人設(shè)計的又一個開源日志組件,官方網(wǎng)站: http://logback.qos.ch。 logback當...
摘要:本文要來分享給大家程序員最常用的日志框架組件。沒有基礎(chǔ)的同學也不要著急,這套教程覆蓋了目前所有的日志框架,只要你學,就一定用得到,先收藏,以備不時之需。 作為一名Java程序員,我們開發(fā)了很多Java應(yīng)用程序,包括桌面應(yīng)用、WEB應(yīng)用以及移動應(yīng)用。然而日志系統(tǒng)是一個成熟Java應(yīng)用所必不可少的。在開發(fā)和調(diào)試階段,日志可以幫...
摘要:如果日志級別等于配置級別,過濾器會根據(jù)和接收或拒絕日志。例如過濾掉所有低于級別的日志。有個子標簽,用于配置求值條件。 沒時間解釋了,快上車,老司機先看代碼 LogBack.xml DEBUG ${MESSAGE_FILE_PATTERN} ...
閱讀 1713·2021-11-24 09:39
閱讀 2497·2021-11-18 10:07
閱讀 3678·2021-08-31 09:40
閱讀 3352·2019-08-30 15:44
閱讀 2642·2019-08-30 12:50
閱讀 3665·2019-08-26 17:04
閱讀 1441·2019-08-26 13:49
閱讀 1279·2019-08-23 18:05