摘要:今天在配置日志的時候,發現日志重復打印的問題。把配置文件修改成如下日志控制臺日志級別日志級別日志級別日志通過以上配置模板即可解決各級別日志重復打印的問題。
今天在配置Log4j日志的時候,發現日志重復打印的問題。網上查了很多資料,發現介紹Log4j配置的文章數量不少,但提到這個問題的文章卻寥寥,解決了自己的問題以后,趕緊記錄一下。
原文地址: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配置文件是個非常常規的文件,網上大多數講解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級別的日志。
二、解決辦法這里提供兩種解決方案:
重寫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.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
通過以上配置模板即可解決各級別日志重復打印的問題。
今天是1024程序員節,兄弟們high起來~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67863.html
摘要:深入學習系列三那些年我們用過的日志框架目前常見的日志框架和中文似乎不太好翻譯有一下幾種即其中,為同一個作者所寫。如前面所述,在才被引入,在這之前,并沒有官方的日志庫供開發者使用。 title: 【Java深入學習系列】三. 那些年我們用過的日志框架date: 2016-10-16 15:32:50 category: java 目前常見的Java日志框架和facades(中文似乎不太好...
摘要:的測試完全不同級別的。記錄請求的級別在高于或等于其的有效級別時被稱為被啟用,否則,稱為被禁用。該規則是的核心。指定名稱,指定的全限定名。對記錄事件進行格式化。查看當前活動文件的大小,如果超過指定大小會告知觸發當前活動文件滾動。 一、logback的介紹 Logback是由log4j創始人設計的又一個開源日志組件,官方網站: http://logback.qos.ch。 logback當...
摘要:本文要來分享給大家程序員最常用的日志框架組件。沒有基礎的同學也不要著急,這套教程覆蓋了目前所有的日志框架,只要你學,就一定用得到,先收藏,以備不時之需。 作為一名Java程序員,我們開發了很多Java應用程序,包括桌面應用、WEB應用以及移動應用。然而日志系統是一個成熟Java應用所必不可少的。在開發和調試階段,日志可以幫...
摘要:如果日志級別等于配置級別,過濾器會根據和接收或拒絕日志。例如過濾掉所有低于級別的日志。有個子標簽,用于配置求值條件。 沒時間解釋了,快上車,老司機先看代碼 LogBack.xml DEBUG ${MESSAGE_FILE_PATTERN} ...
閱讀 1712·2021-11-24 09:39
閱讀 2494·2021-11-18 10:07
閱讀 3677·2021-08-31 09:40
閱讀 3350·2019-08-30 15:44
閱讀 2641·2019-08-30 12:50
閱讀 3663·2019-08-26 17:04
閱讀 1438·2019-08-26 13:49
閱讀 1275·2019-08-23 18:05