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()
來判斷是否包含指定字符串的。
log4j.xml中Filter的用法