首页 > 解决方案 > log4j 属性 BurstFilter 配置

问题描述

我正在尝试使用log4j.properties格式为一个特定的 Appender 配置 BurstFilter。log4j 的版本是 1,不幸的是 Apache Kafka 还没有支持或 log4j2。https://home.apache.org/~dongjin/post/apache-kafka-log4j2-support/

我无法.properties在互联网上找到 Burstfilter 的任何格式示例。

这是我配置的第一部分。我想在哪里添加 BurstFilter。这种配置效果很好。

log4j.rootLogger=INFO, graylog2
log4j.logger.org.reflections=ERROR

log4j.appender.graylog2=org.graylog2.log.GelfAppender
log4j.appender.graylog2.graylogHost=1.1.1.1
log4j.appender.graylog2.graylogPort=12201
log4j.appender.graylog2.originHost=my-hostname
log4j.appender.graylog2.facility=gelf-java
log4j.appender.graylog2.layout=org.apache.log4j.PatternLayout
log4j.appender.graylog2.layout.ConversionPattern=%d{ISO8601} %-5p  %X{dbz.connectorType}|%X{dbz.connectorName}|%X{dbz.connectorContext}  %m   [%c]%n
log4j.appender.graylog2.extractStacktrace=true
log4j.appender.graylog2.addExtendedInformation=true
log4j.appender.graylog2.additionalFields={'hostname': 'my-hostname'}

我想补充的是:

log4j.appender.graylog2.filter=org.apache.logging.log4j.core.filter.BurstFilter
log4j.appender.graylog2.filter.level=INFO
log4j.appender.graylog2.filter.rate=16
log4j.appender.graylog2.filter.maxBurst=100

但是当我使用一些属性到 XML 转换器时,例如http://logback.qos.ch/translator/我无法获得预期的结果,如下所示:https ://logging.apache.org/log4j/2 .x/manual/filters.html

我还没有真正尝试在我的 Java 服务器上使用此配置,我想避免试错法。任何帮助表示赞赏。

标签: javaloggingapache-kafkalog4j

解决方案


嗯,您的第一个属性文件示例适用于 Log4j 1,而不是 Log4j 2。如果它正在工作,则意味着您仍在使用 Log4j 1 或处于兼容模式。既然你没有提到它,我怀疑是这样的。如果您确实在使用 Log4j 1 并且不想使用 Log4j 2,那么您将不得不自己重新实现 Log4j 1 的 BurstFilter。Log4j 1 于 2015 年 8 月结束生命周期,报告了几个永远无法修复的安全漏洞,并且在 Java 9+ 中存在与检测 JDK 版本有关的错误,该版本也永远不会修复。

如果您确实想使用 Log4j 2 和 BurstFilter,请继续阅读,否则请在此处停止。

您是否有理由要使用属性而不是 XML、JSON 或 YAML?虽然我添加了对 Log4j 2 的属性支持,但我真的不喜欢它。Log4j 的配置实际上是一个层次结构,很容易用 XML、JSON 或 YAML 表示。用属性模拟层次结构感觉很麻烦。

翻译时最简单的做法是查看 XML 并意识到每个属性和元素都必须表示为子属性。所以在下面你会看到,突发过滤器的属性都必须出现在 appender.StdOut.filter.burst 下,以便可以使用名为 StdOut 的 Appender 和 BurstFilter 来识别属性,其属性都分组在“burst 元素”下”。

appender.Stdout.type = Console
appender.Stdout.name = StdOut
appender.Stdout.target = SYSTEM_OUT
appender.Stdout.layout.type = PatternLayout
appender.Stdout.layout.pattern = %d [%t] %-5level: %msg%n%throwable
appender.Stdout.filter.burst.type = BurstFilter
appender.Stdout.filter.burst.onMatch = DENY
appender.Stdout.filter.burst.onMisMatch = NEUTRAL
appender.Stdout.filter.burst.level = INFO
appender.Stdout.filter.burst.rate = 16
appender.Stdout.filter.burst.maxBurst = 100

相比之下,用于此的 XML 将是

<Console name="StdOut" target="SYSTEM_OUT">
  <PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable"/>
  <BurstFilter level="INFO" rate="16" maxBurst="100" onMatch="DENY" onMisMatch="NEUTRAL"/>
</Console>

我也可以将它与 JSON 和 YAML 进行比较,但希望你明白这一点。属性格式更长,IMO 更难理解。综上所述,如果您的应用程序中没有 XML、JSON 或 YAML 库,那么使用属性将始终有效。


推荐阅读