Log4j2.xml 中的 RegexFilter 未按预期过滤日志

问题描述 投票:0回答:1

我似乎无法让

RegexFilter
工作。我已按如下方式设置
log4j2.xml
文件:

<Console name="prodOutput" target="SYSTEM_OUT">
    <PatternLayout pattern="[%d] [Org Utility] -- [ITEM1=%X{ITEM1} ITEM2=%X{ITEM2} ITEM3=%X{ITEM3} USERID=%X{USERID} ENV=%X{ENV}]- [%t] %-5p %c %x - %m%n"/>
    <Filters>
        <RegexFilter regex=".*ENV=local.*" useRawMsg="false" onMatch="DENY" onMismatch="NEUTRAL"/>
    </Filters>
</Console>

<Loggers>

        <!-- switch off log output from these packages -->
        <Logger name="orgName.package1" level="debug" additivity="false">
            <appender-ref ref="prodOutput"/>
        </Logger>

        <!-- retain log output for other packages -->
        <Logger name="orgName" level="trace" additivity="false">
            <appender-ref ref="${sys:logger.out.type}"/>
        </Logger>
        <Root level="info" additivity="false">
            <appender-ref ref="${sys:logger.out.type}"/>
        </Root>

</Loggers>

这是我们的日志输出的示例,但不知何故,此包中的日志

orgName.package1
没有获取正则表达式,因为我仍然可以在控制台中看到此包中的日志。

[2023-01-03 12:41:56,353] [Org Utility] -- [ITEM1=XX ITEM2=XX ITEM3=XX USERID=@ADMIN ENV=local]- [ForkJoinPool-1-worker-29] DEBUG orgName.executeRule [] ...

因为当我用简单的

.*
替换正则表达式时,包
orgName.package1
的输出不会显示在控制台中。

ENV
ThreadContextMap
的值为
local
,所以我期望日志输出为
... ENV=local ...
并且确实如此,如控制台中所示。但正则表达式不知何故没有检测到此日志。

是否有我遗漏的设置或配置?或者也许我写错了正则表达式?但我在 regex101.com 上仔细检查了我的正则表达式,并且我编写的测试用例通过了,这是一个样本

java log4j log4j2
1个回答
4
投票

我明白为什么

RegexFilter
不起作用,这是因为我试图在记录器上应用正则表达式而不是消息。

RegexFilter
旨在对messages应用正则表达式,即仅使用
PatternLayout
转换模式
%m中定义的部分,而不是与记录器相关的详细信息(类型、时间、包) ,类名等)。


示例

这是log4j2.xml文件中的模式定义:

<PatternLayout pattern="%d{ISO8601} %p %C.%M - %m%n"/>

这是一个示例日志:

2024-03-28T05:40:30,667 INFO com.example.Foo.doSomething - This is a log message

因此,使用

<RegexFilter>
您只能定位 消息,在本例中为:

这是一条日志消息

仅检查这部分是否匹配


我引用了这个 StackOverflow post,它与我的问题非常相似。

希望这对任何遇到此问题的人都有帮助,干杯!

© www.soinside.com 2019 - 2024. All rights reserved.