Log4j2 RegexFilter 模式不匹配

Dee*_*eeP 4 java regex filter pattern-matching log4j2

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

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

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

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

[信息] 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>
Run Code Online (Sandbox Code Playgroud)

当切换“接受”和“拒绝”时,没有消息通过,因此 RegexFilter 本身似乎被拾取。我也试过 "\bTimingFilter\b", ".*\bTimingFilter\b.*" 没有成功。

我正在使用 Log4J 2.11。

你能给出任何提示我做错了什么吗?我检查了所有其他RegexFilter相关问题here和其他网站(这是我在那里得到了我尝试过的正则表达式模式的建议),但似乎没有任何效果。我还根据我的日志检查了https://regex101.com/上的模式,它们匹配正确。

D.B*_*.B. 5

发生这种情况是因为您已将其useRawMsg="true"切换为 useRawMsg="false"。请参阅log4j2 手册

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

编辑:

我没有仔细查看您的配置和输出,因此我对此深表歉意。RegexFilter对您不起作用的原因是您正在使用它来尝试根据logger名称进行过滤。根据log4j2 手册

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

这是 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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例 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>
Run Code Online (Sandbox Code Playgroud)

请注意我如何配置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!
Run Code Online (Sandbox Code Playgroud)