log4j.xml中Filter的用法


前言

log4j中常用的Filter分為四種:DenyAllFilter、LevelMatchFilter、LevelRangeFilter、StringMatchFilter。
當appender匹配了某個Filter的時候,就不會繼續匹配下一個filter,所以當需要配置多個filter時需要注意先后順序,這樣才能實現需要的效果。
這些filter有個共同的屬性AcceptOnMatch,用來控制匹配到的appender是否打印日志。

只打印指定level的日志

假如現在只希望打印INFO和ERROR級別的日志,可以這樣配置:

<appender name="cntCorelog" class="org.apache.log4j.rolling.RollingFileAppender">
	......
	<filter class="org.apache.log4j.varia.LevelMatchFilter">
		<param name="LevelToMatch" value="INFO" />
		<param name="AcceptOnMatch" value="true"/>
	</filter>
	<filter class="org.apache.log4j.varia.LevelMatchFilter">
		<param name="LevelToMatch" value="ERROR" />
		<param name="AcceptOnMatch" value="true"/>
	</filter>
	<filter class="org.apache.log4j.varia.DenyAllFilter" />
</appender>

這里如果不配置最后一個filter,則會放行所有日志輸出。

不打印指定level的日志

假如不希望打印DEBUG級別的日志,可以這樣配置:

<filter class="org.apache.log4j.varia.LevelMatchFilter">
	<param name="LevelToMatch" value="ERROR" />
	<param name="AcceptOnMatch" value="false" />
</filter>

AcceptOnMatch表示是否輸出日志,這里需要注意的是,一旦匹配了某個filter,就無法再匹配后續的filter了,如下:

<filter class="org.apache.log4j.varia.LevelMatchFilter">
	<param name="LevelToMatch" value="ERROR" />
	<param name="AcceptOnMatch" value="false" />
</filter>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
	<param name="LevelToMatch" value="ERROR" />
	<param name="AcceptOnMatch" value="true" />
</filter>

對於上面的配置,ERROR級別的日志匹配了第一個filter后,結果是被過濾掉不被輸出,於是第二個filter就不生效了。

如果將上邊的配置顛倒過來,如下:

<filter class="org.apache.log4j.varia.LevelMatchFilter">
	<param name="LevelToMatch" value="ERROR" />
	<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.LevelMatchFilter">
	<param name="LevelToMatch" value="ERROR" />
	<param name="AcceptOnMatch" value="false" />
</filter>

這時候ERROR級別的日志就依然能正常被打印出來。

只打印從level A到B之間的所有日志

假如現在只想要打印INFO到ERROR級別之間的日志,可以這樣配置:

<filter class="org.apache.log4j.varia.LevelRangeFilter">
	<param name="LevelMin" value="INFO"/>
	<param name="LevelMax" value="ERROR"/>
	<param name="AcceptOnMatch" value="true" />
</filter>

需要注意的是,對於LevelRangeFilter,會匹配所有的appender,如果將該filter置於其他filter的前面,則會導致后續的filter無效。

只打印包含某些字符串的日志

假如只希望打印某些字符串的日志,可以這樣配置:

<filter class="org.apache.log4j.varia.StringMatchFilter">
	<param name="StringToMatch" value="test" />
	<param name="AcceptOnMatch" value="true" />
</filter>

如上配置,如果日志里包含了test這個字符串就會被輸出到日志了,如果是包含某些字符串就不打印出來,直接將AcceptOnMatch設成false就行。

如果不配置StringToMatch的value,該filter無效;如果將其value配置為""空字符串,該filter則會匹配所有日志。在StringMatchFilter的源碼實現里,是通過indexOf()來判斷是否包含指定字符串的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM