java - 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 服务器上使用此配置,我想避免试错法。任何帮助表示赞赏。
解决方案
嗯,您的第一个属性文件示例适用于 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 库,那么使用属性将始终有效。
推荐阅读
- laravel - 如何将 OTP 发送到 Laravel 中的用户电话号码
- python - pip install pyodbc 不安装软件包,只安装 dist 信息文件,vsc 不自动完成 pyodbc 代码
- mlr3 - 在 MLR3 Ranger 设置 class.weights 中,错误“'xs' 上的断言失败:class.weights:必须长度为 1”
- javascript - 错误:在 XMLHttpRequest.handleLoad (xhr.js:62) 的结算 (settle.js:17) 处的 createError (createError.js:16) 处请求失败,状态码为 404
- c++ - 在 C++ 中获取模板类型的“嵌套”模板参数的数量
- java - hamburgerMenu 无法使用硒
- reactjs - Reactjs:TypeError:无法读取未定义的属性“帖子”
- python - 无法使用预训练模型
- python - 如何从抓取的 html 页面(python)中生成(然后写入)xml 文件
- azure - 通过 Azure 应用程序代理的 SignalR 连接