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