首页 > 解决方案 > Log4j2 根据属性禁用附加程序

问题描述

我有两个附加程序:控制台和 Kibana 附加程序。在开发环境上运行时,我希望有可能禁用 Kibana appender。

我尝试了多种方法来实现它,但没有任何效果:

  1. 如何以编程方式从 log4j2 中的记录器中删除附加程序?- 即使我删除了 appender,它仍然会发送日志

  2. 如何根据 java 系统属性有条件地添加 log4j2 appender? <AppenderRef ref="elasticsearchAsyncBatch" level="${sys:logLevel:-all}"/>- appender 忽略通过命令行传递的变量:export LOG_LEVEL=off 并始终使用默认值,所有这些都在本例中。脚本解决方案有同样的问题

  3. <ThresholdFilter level="${sys:logLevel}" onMatch="ACCEPT" onMismatch="DENY"/>- 级别属性不接受动态值并抛出无法将“${sys:logLevel}”转换为级别枚举的错误

Log4j 版本 2.11.2

标签: javalogginglog4jlog4j2

解决方案


根据您提供的信息,选项 1 的问题尚不清楚。您是如何删除附加程序的?您不能只是从配置中删除它,因为所有配置的记录器仍将指向它。您必须首先修改所有已配置的记录器附加程序引用以指向不同的附加程序。

对于解决方案 2,您已指定${sys:loglevel:-all}但随后尝试通过环境变量设置其值。您需要使用 -Dloglevel=DEBUG 启动您的应用程序才能使其正常工作。或者,您可以指定 ${env:LOG_LEVEL:-all} 并使用您设置的环境变量。

我希望解决方案 3 与解决方案 2 存在相同的问题。由于您在找不到 loglevel 系统属性时没有指定默认值,因此它只是将自身作为字符串返回,这显然是一个无效值。


推荐阅读