log4j 是否可以使用正则表达式过滤ThreadContextMap的键值对?

35g0bw71  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(192)

大家好,新年快乐!
如果ThreadContextMap中的“env”键的值为prod1qa1,我希望过滤某些日志。我已经进行了如下设置:

<Console name="prodOutput" target="SYSTEM_OUT">
    <PatternLayout pattern="..."/>
    <Filters>
        <ThreadContextMapFilter onMatch="DENY" onMismatch="NEUTRAL" operator="or">
            <KeyValuePair key="ENV" value="qa1"/>
            <KeyValuePair key="ENV" value="prod1"/>
        </ThreadContextMapFilter>
    </Filters>
</Console>

但是这段代码“硬编码”了prod1qa1的值。为了使代码具有可扩展性,我希望过滤掉那些与"prod\d+""qa\d+"的正则表达式匹配的日志。
与这些正则表达式匹配的值包括"prod1""qa2"
这是因为我们不希望这些特定日志出现在生产和qa环境中
ThreadContextMap中,我们要检查的键值对是ENV-prod1ENV-qa1
我试着在StackOverflow和log4j 2文档上搜索,但似乎没有任何提到如何做这样的事情。
有没有人对我如何处理这件事有什么想法?感谢任何投入:)我也对其他想法持开放态度!

5f0d552i

5f0d552i1#

我设法找到了一个变通的解决方案,在该解决方案中,我将regex应用于插入到ThreadContextMap中的值
这样,我只需要检查ThreadContextMapFilterprodqa中的2个值
这个解决方案是令人满意的,因为它的工作和满足我们的要求。对于那些好奇,它看起来像这样:

@Value("${env}")
private String environment;
...
// check environment against regex
boolean matchesProdRegex = Pattern.matches(".*prod.*", this.environment);
boolean matchesQaRegex = Pattern.matches(".*qa.*", this.environment);
if (matchesProdRegex ) {
  ThreadContext.put("ENV", "prod");
} else if (matchesQaRegex ) {
  ThreadContext.put("ENV", "qa");
} else {
  ThreadContext.put("ENV", this.environment);
}

因此,在log4j2.xml中,ThreadContextMapFilter看起来如下所示:

<Console name="prodOutput" target="SYSTEM_OUT">
    <PatternLayout pattern="..."/>
    <Filters>
        <ThreadContextMapFilter onMatch="DENY" onMismatch="NEUTRAL" operator="or">
            <KeyValuePair key="ENV" value="qa"/>
            <KeyValuePair key="ENV" value="prod"/>
        </ThreadContextMapFilter>
    </Filters>
</Console>

感谢任何花时间阅读我的帖子的人&希望这能成为未来任何人的有用参考,干杯!

相关问题