簡體   English   中英

是否可以使用 Regex 過濾 ThreadContextMap 的鍵值對?

[英]Is it possible to filter key-value pairs of a ThreadContextMap with a Regex?

大家好,新年快樂!

如果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>

但是這段代碼“硬編碼”了值prod1 & qa1 本着使代碼可擴展的精神,我想過濾掉那些匹配正則表達式"prod\d+""qa\d+"的日志。

與這些正則表達式匹配的值包括"prod1""qa2"

這是因為我們不希望那些特定的日志出現在生產和質量檢查環境中

ThreadContextMap中,我們要檢查的鍵值對是ENV - prod1ENV - qa1

我嘗試在 StackOverflow 和 log4j2 文檔上進行搜索,但似乎沒有提及如何完成這樣的事情。

有人對我如何解決這個問題有任何想法嗎? 感謝您的任何投入:)我也對其他想法持開放態度!

我設法找到了一個變通解決方案,我改為將正則表達式應用於插入到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>

感謝所有花時間閱讀我的帖子的人,希望這對以后的任何人都有用,干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM