按匹配模式过滤日志 - log4j

6
我在log4j xml文件中有以下布局模式: "%d{ISO8601} %c %p [%t] [%x] 9.5.4.RC12 %m%n" 我想要的是,每当我收到一条包含消息process [proc#] completed的日志时,应该跳过它。我的意思是除了包含此消息的日志之外,应该打印所有其他日志。 [proc#]将包含最大长度为4的进程号。
我如何设计一个带有此功能的筛选器在我的xml配置文件中?如果可以,请告诉我如何做?
2个回答

8

ExpressionFilter可以实现这一点。

在appender定义内部的过滤器定义中,使用类似于以下表达式(注意LIKE是正则表达式匹配操作符):

"MSG LIKE 'process \[.*\] completed'"

在此处查看ExpressionFilter javadoc:

http://logging.apache.org/log4j/companions/apidocs/org/apache/log4j/filter/ExpressionFilter.html

例子

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
    <appender name="CONSOLE">
        <param name="Target" value="System.out"/>
        <layout>
            <param name="ConversionPattern" value="%d %p [%c] - %m%n"/>
        </layout>
        <filter class="org.apache.log4j.filter.ExpressionFilter">
            <param name="expression" value="EXCEPTION ~= com.company.BackendNotAvailableException" />
            <param name="acceptOnMatch" value="false"/>
        </filter>
    </appender>
    <root>
        <priority value ="INFO" />
        <appender-ref ref="CONSOLE"/>
    </root>
</log4j:configuration>

这个例子来自这里:http://blog.trifork.com/2011/08/23/filtering-specific-exceptions-when-using-log4j/


1
~= 运算符是做什么用的? - Frederic Leitenberger
这是一个不区分大小写的部分文本匹配。 - Scott
谢谢。有没有一个包含所有运算符及其含义的列表? - Frederic Leitenberger
在帮助菜单下有一个教程 - 教程列出了所有的运算符。 - Scott
哪个帮助菜单?上下文是什么? - Frederic Leitenberger
显示剩余2条评论

3
这是我配置log4j按IP地址过滤的方法。特别是在下面的log4j.xml中,过滤了127.0.0.1。请注意,您还必须将log4j.dtdlog4j.xml一起使用,并且必须使用XML语法。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="CATALINA" 
            class="org.apache.log4j.DailyRollingFileAppender">
        <param name="Append" value="true" />
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
        <param name="Encoding" value="UTF-8" />
        <param name="File" value="${catalina.base}/logs/catalina" />
        <layout class="net.logstash.log4j.JSONEventLayoutV1" />
    </appender>
    <appender name="CATALINAOUT" 
            class="org.apache.log4j.ConsoleAppender">
        <param name="Append" value="true" />
        <param name="Encoding" value="UTF-8" />
        <param name="File" value="${catalina.base}/logs/catalina.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" 
                value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
        </layout>


        <filter class="org.apache.log4j.filter.ExpressionFilter">
            <param name="expression" value="MSG LIKE '127.0.0.1'" />
            <param name="acceptOnMatch" value="false"/>
        </filter>


    </appender>
    <appender name="LOCALHOST" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="Append" value="true" />
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
        <param name="Encoding" value="UTF-8" />
        <param name="File" value="${catalina.base}/logs/localhost" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %c- %m%n" />
        </layout>
    </appender>
    <logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost]">
        <level value="INFO" />
        <appender-ref ref="LOCALHOST" />
    </logger>
    <root>
        <level value="INFO" />
        <appender-ref ref="CATALINA" />
        <appender-ref ref="CATALINAOUT" />
    </root>
</log4j:configuration>

有一个方便的工具可以将 log4j.properties 转换为 log4j.xml。我用它来生成所有内容,但 <filter> 元素除外。https://github.com/jroyals/log4j-properties-converter - wsams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接