我正在尝试在
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、代码流中使用的微米类)启用调试/跟踪日志,这不是预期的行为。
到目前为止尝试过的故障排除:
requestLogLevel
MDC 密钥设置正确。logger.app.additivity
设置为 false 以避免从根记录器继承配置。DynamicThresholdFilter
按预期工作,但全局适用于所有包。如何配置
DynamicThresholdFilter
仅适用于特定包 (com.example.orange),而不影响其他记录器?有没有办法限制过滤器的范围或覆盖行为?
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