Log4j2 RegexFilter模式不匹配

时间:2018-05-20 13:18:30

标签: java regex filter pattern-matching log4j2

我的日志中有以下要排除的行,所以我想使用regexfilter来执行此操作:

[INFO] 2018-05-20 14:52:15.993 [qtp22844606-20] TimingFilter - 请求时间:16毫秒

[INFO] 2018-05-20 14:52:18.998 [qtp22844606-17] TimingFilter - 请求时间:15毫秒

[INFO] 2018-05-20 14:52:22.001 [qtp22844606-20] TimingFilter - 请求时间:0毫秒

[INFO] 2018-05-20 14:52:24.992 [qtp22844606-17] TimingFilter - 请求时间:0毫秒

我的配置看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders> 
        <Console name="console" target="SYSTEM_OUT">
            <RegexFilter regex=".*TimingFilter.*" useRawMsg="true" onMatch="DENY" onMismatch="ACCEPT"/>
            <PatternLayout   pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info" additivity="false">
            <appender-ref ref="console" />
        </Root>
    </Loggers>
</Configuration>

切换&#34; ACCEPT&#34;和&#34; DENY&#34;没有消息通过,所以RegexFilter本身似乎被拿起了。我也试过&#34; \ bTimingFilter \ b&#34;,&#34;。* \ bTimingFilter \ b。*&#34;没有成功。

我使用的是Log4J 2.11。

你能否提出我做错的任何提示?我在这里检查了所有其他RegexFilter相关问题以及其他网站(我在那里获得了我试过的Regex模式的建议),但似乎没有任何效果。 我还根据我的日志检查了https://regex101.com/上的模式,并且它们匹配正确。

1 个答案:

答案 0 :(得分:2)

这是因为您useRawMsg="true"将其切换为useRawMsg =“false”。请参阅log4j2 manual

  

如果为true,将使用未格式化的消息,否则格式化   消息将被使用。默认值为false。   

编辑:

我对你的配置和输出没有仔细观察,所以我为此道歉。 RegexFilter不适合您的原因是您正在使用它来尝试根据name of the logger进行过滤。根据{{​​3}}:

  

RegexFilter允许格式化或未格式化的消息   与正则表达式进行比较。

为防止记录器记录任何消息,您有多个选项。我将用下面的示例代码说明其中一个。

这是一个运行TimingFilter类的主类:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main {

private static final Logger log = LogManager.getLogger();

    public static void main(String[] args){
        log.info("Here's some info!");
        log.error("Some erorr happened!");
        TimingFilter.main(null);
    }

}

这是TimingFilter类:

package example;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class TimingFilter {

    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args){
        log.info("Here's some info!");
        log.error("Some erorr happened!");
    }
}

以下是log4j2.xml文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders> 
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout   pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger level="off" name="example.TimingFilter">
        </Logger>
        <Root level="info" additivity="false">
            <appender-ref ref="console" />
        </Root>
    </Loggers>
</Configuration>

注意我是如何配置example.TimingFilter记录器以使其级别“关闭”的。这可以防止从此记录器进行任何记录。

当我运行Main类时,输出仅包含来自Main的消息:

[INFO ] 2018-05-22 23:23:30.473 [main] Main - Here's some info!
[ERROR] 2018-05-22 23:23:30.474 [main] Main - Some erorr happened!