DynamicThresholdFilter 不适用于 Log4j2 中的特定包

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

我正在尝试在

DynamicThresholdFilter
中应用
Log4j2
来过滤特定包(com.example.orange)的日志。我的目标是基于自定义
MDC
键 (requestLogLevel) 仅为此包动态启用调试/跟踪日志。

这是我用于特定包记录器的配置:

# Appenders
appender.console.type=Console
appender.console.name=Console
appender.console.target=SYSTEM_OUT
appender.console.follow=true
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=${LOG_PATTERN}

logger.app.name=com.example.orange
logger.app.level=warn
logger.app.additivity=false
logger.app.appenderRef.console.ref=Console

# Dynamic threshold filter: supposed to apply DEBUG for only the com.example.orange package
logger.app.filter.type=DynamicThresholdFilter
logger.app.filter.key=requestLogLevel
logger.app.filter.defaultThreshold=WARN
logger.app.filter.onMatch=ACCEPT
logger.app.filter.onMismatch=NEUTRAL
logger.app.filter.keyValuePair.type=KeyValuePair
logger.app.filter.keyValuePair.key=TRACE
logger.app.filter.keyValuePair.value=TRACE
logger.app.filter.keyValuePair[1].type=KeyValuePair
logger.app.filter.keyValuePair[1].key=DEBUG
logger.app.filter.keyValuePair[1].value=DEBUG

但是,当我在 MDC 中将 requestLogLevel 设置为 DEBUG 或 TRACE 时,此配置不会启用 com.example.orange 的 DEBUG 日志。日志仍然遵循默认阈值 WARN。

如果我将

DynamicThresholdFilter
移至全局过滤器,如下所示:

# Appenders
appender.console.type=Console
appender.console.name=Console
appender.console.target=SYSTEM_OUT
appender.console.follow=true
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=${LOG_PATTERN}

filter.console.type=DynamicThresholdFilter
filter.console.key=requestLogLevel
filter.console.defaultThreshold=WARN
filter.console.onMatch=ACCEPT
filter.console.onMismatch=NEUTRAL
filter.console.keyValuePair.type=KeyValuePair
filter.console.keyValuePair.key=TRACE
filter.console.keyValuePair.value=TRACE
filter.console.keyValuePair[1].type=KeyValuePair
filter.console.keyValuePair[1].key=DEBUG
filter.console.keyValuePair[1].value=DEBUG

它可以工作,但它将过滤器全局应用于所有包,从而为我的应用程序流中的所有包(例如 spring、代码流中使用的微米类)启用调试/跟踪日志,这不是预期的行为。

到目前为止尝试过的故障排除:

  1. 验证
    requestLogLevel
    MDC 密钥设置正确。
  2. 确保
    logger.app.additivity
    设置为 false 以避免从根记录器继承配置。
  3. 确认全局
    DynamicThresholdFilter
    按预期工作,但全局适用于所有包。

如何配置

DynamicThresholdFilter
仅适用于特定包 (com.example.orange),而不影响其他记录器?有没有办法限制过滤器的范围或覆盖行为?

java spring-boot log4j2 project-reactor slf4j
1个回答
0
投票

Java 属性配置格式不像其他配置格式那样遵循一组统一的规则:它有一些怪癖,以使其不那么冗长(请参阅Java 属性格式怪癖)。 特别是:

要将过滤器添加到组件,请使用

filter.<id>
前缀,而不仅仅是
<id>

因此您需要在您的属性中添加额外的

<id>

logger.app.filter.0.type=DynamicThresholdFilter
logger.app.filter.0.key=requestLogLevel
logger.app.filter.0.defaultThreshold=WARN
logger.app.filter.0.onMatch=ACCEPT
logger.app.filter.0.onMismatch=NEUTRAL
logger.app.filter.0.keyValuePair.type=KeyValuePair
logger.app.filter.0.keyValuePair.key=TRACE
logger.app.filter.0.keyValuePair.value=TRACE
logger.app.filter.0.keyValuePair[1].type=KeyValuePair
logger.app.filter.0.keyValuePair[1].key=DEBUG
logger.app.filter.0.keyValuePair[1].value=DEBUG
© www.soinside.com 2019 - 2024. All rights reserved.