通过属性文件为 Log4j2 中的特定记录器配置复合过滤器

Configure composite filter for specific logger in Log4j2 via properties file

Log4j2 提供了多种过滤器 [1],这些过滤器可以在四个级别进行配置:

  1. 上下文范围
  2. 记录器
  3. 追加器
  4. Appender 参考

在我的用例中,我想使用[在指定的记录器(上面的第 2 级)设置一个 CompositeFilter属性 文件语法.

为了示例,我们假设我们要设置一个由两个 RegexFilter 分别匹配 .*SQL.*.*JPQL.* 组成的复合过滤器。假设我们有以下事件:

logger.info("Messase with no keyword");
logger.info("Messase with SQL keyword");
logger.info("Messase with JPQL keyword");
logger.info("Messase with both SQL and JPQL keywords");

复合筛选器只应传递最后一个事件。

我做了几次尝试 [2](也在下面概述)以获得所需的输出,但我无法弄清楚如何使用 属性 语法正确设置 CompositeFilter 所以任何帮助将不胜感激。

尝试 0

logger.t1.filter.f1.type = RegexFilter
logger.t1.filter.f1.regex = .*SQL.*
logger.t1.filter.f1.onMatch = NEUTRAL
logger.t1.filter.f1.onMismatch = DENY
logger.t1.filter.f2.type = RegexFilter
logger.t1.filter.f2.regex = .*JPQL.*
logger.t1.filter.f2.onMatch = ACCEPT
logger.t1.filter.f2.onMismatch = DENY
logger.t1.appenderRefs = a
logger.t1.appenderRef.a.ref = L0

尝试 1

logger.t1.filters = f1, f2
logger.t1.filter.f1.type = RegexFilter
logger.t1.filter.f1.regex = .*SQL.*
logger.t1.filter.f1.onMatch = NEUTRAL
logger.t1.filter.f1.onMismatch = DENY
logger.t1.filter.f2.type = RegexFilter
logger.t1.filter.f2.regex = .*JPQL.*
logger.t1.filter.f2.onMatch = ACCEPT
logger.t1.filter.f2.onMismatch = DENY

尝试 2

logger.t1.filters.f1.type = RegexFilter
logger.t1.filters.f1.regex = .*SQL.*
logger.t1.filters.f1.onMatch = NEUTRAL
logger.t1.filters.f1.onMismatch = DENY
logger.t1.filters.f2.type = RegexFilter
logger.t1.filters.f2.regex = .*JPQL.*
logger.t1.filters.f2.onMatch = ACCEPT
logger.t1.filters.f2.onMismatch = DENY
logger.t1.appenderRefs = a
logger.t1.appenderRef.a.ref = L0

尝试 3

logger.t1.filter.M.type = Filters
logger.t1.filter.M.f1.type = RegexFilter
logger.t1.filter.M.f1.regex = .*SQL.*
logger.t1.filter.M.f1.onMatch = NEUTRAL
logger.t1.filter.M.f1.onMismatch = DENY
logger.t1.filter.M.f2.type = RegexFilter
logger.t1.filter.M.f2.regex = .*JPQL.*
logger.t1.filter.M.f2.onMatch = ACCEPT
logger.t1.filter.M.f2.onMismatch = DENY
logger.t1.appenderRefs = a
logger.t1.appenderRef.a.ref = L0

一些进一步的说明:

[1] https://logging.apache.org/log4j/2.x/manual/filters.html

[2]https://github.com/zabetak/logging-log4j2/commit/a9944885100db42f7e3ba1b3ff81d59b743d0ab7

您的配置有两个问题:

  1. A LoggerConfig 只接受一个过滤器。如果要使用多个过滤器,请显式配置 CompositeFilter(其插件名称为“Filters”),
  2. 属性配置文件中过滤器的顺序基本上是随机的,因为 PropertiesHashtable 并且没有预定义的顺序。

考虑到以上两个事实,尝试 3 的变体应该可行:

logger.t1.filter.M.type = Filters
logger.t1.filter.M.f1.type = RegexFilter
logger.t1.filter.M.f1.regex = .*SQL.*
logger.t1.filter.M.f1.onMatch = NEUTRAL
logger.t1.filter.M.f1.onMismatch = DENY
logger.t1.filter.M.f2.type = RegexFilter
logger.t1.filter.M.f2.regex = .*JPQL.*
logger.t1.filter.M.f2.onMatch = NEUTRAL
logger.t1.filter.M.f2.onMismatch = DENY

两个过滤器 return NEUTRAL,当模式匹配时,这保证了过滤器顺序的反转不会破坏逻辑。