1. 程式人生 > >log4j.xml中Filter的用法

log4j.xml中Filter的用法

空字符串 其他 輸出日誌 accept 所有 效果 lte apach deb

前言

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的用法