通过属性文件为 Log4j2 中的特定记录器配置复合过滤器
Configure composite filter for specific logger in Log4j2 via properties file
Log4j2 提供了多种过滤器 [1],这些过滤器可以在四个级别进行配置:
- 上下文范围
- 记录器
- 追加器
- 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
一些进一步的说明:
- 我对设置
CompositeFilter
非常感兴趣,不是
编写自定义过滤器,而不是使用单个组合 RegexFilter
等
- 我有兴趣看看它是如何使用 属性 语法完成的,而不是
XML、JSON 或其他。
[1] https://logging.apache.org/log4j/2.x/manual/filters.html
[2]https://github.com/zabetak/logging-log4j2/commit/a9944885100db42f7e3ba1b3ff81d59b743d0ab7
您的配置有两个问题:
- A
LoggerConfig
只接受一个过滤器。如果要使用多个过滤器,请显式配置 CompositeFilter
(其插件名称为“Filters”),
- 属性配置文件中过滤器的顺序基本上是随机的,因为
Properties
是 Hashtable
并且没有预定义的顺序。
考虑到以上两个事实,尝试 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
,当模式匹配时,这保证了过滤器顺序的反转不会破坏逻辑。
Log4j2 提供了多种过滤器 [1],这些过滤器可以在四个级别进行配置:
- 上下文范围
- 记录器
- 追加器
- 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
一些进一步的说明:
- 我对设置
CompositeFilter
非常感兴趣,不是 编写自定义过滤器,而不是使用单个组合RegexFilter
等 - 我有兴趣看看它是如何使用 属性 语法完成的,而不是 XML、JSON 或其他。
[1] https://logging.apache.org/log4j/2.x/manual/filters.html
[2]https://github.com/zabetak/logging-log4j2/commit/a9944885100db42f7e3ba1b3ff81d59b743d0ab7
您的配置有两个问题:
- A
LoggerConfig
只接受一个过滤器。如果要使用多个过滤器,请显式配置CompositeFilter
(其插件名称为“Filters”), - 属性配置文件中过滤器的顺序基本上是随机的,因为
Properties
是Hashtable
并且没有预定义的顺序。
考虑到以上两个事实,尝试 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
,当模式匹配时,这保证了过滤器顺序的反转不会破坏逻辑。