前言
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()
來判斷是否包含指定字符串的。