我试图弄清楚如何根据是否给定/设置了java系统属性来向记录器添加附加器。
假设我有这样一个基本配置:
<Logger name="myLogger" level="info" additivity="false">
<AppenderRef ref="myAppender1" />
<AppenderRef ref="myAppender2" />
</Logger>
所以现在我想找出一种方法,如果我提供了一个参数-PaddAppender 2,那么就有条件地只添加第二个appender。
<Logger name="myLogger" level="info" additivity="false">
<AppenderRef ref="myAppender1" />
<?if (${sys:enableAppender2:-false) == "true"}>
<AppenderRef ref="myAppender2" />
</?if>
</Logger>
我该怎么做呢?
例如,我可以在给定的属性(“logLevel”)上动态设置级别,如下所示(如果没有给定该属性,则“info”为默认值):
<Logger name="test" level="${sys:logLevel:-info}" additivity="false">
我看了看documentation for filters,我想不出来。当然,如果过滤器是正确的方式去这里。
6条答案
按热度按时间pu3pd22g1#
无需任何脚本的解决方案:
rfbsl7qr2#
Robert提供的解决方案可以工作,但效率不高,因为每个日志记录只评估一次脚本。
一个更有效的解决方案是将
ScriptAppenderSelector
与NullAppender
一起使用,该解决方案只对脚本求值一次:根据文件:
脚本追加器选择器
建置组态时,ScriptAppenderSelector附加程式会呼叫指令码来计算附加程式名称。Log4j接着会使用ScriptAppenderSelector的名称,建立AppenderSet下列示的其中一个附加程式名称。组态之后,Log4j会忽略ScriptAppenderSelector。
空追加器
忽略日志事件的追加器。用于与1.2版兼容并***便于编写ScriptAppenderSelector***。
参考
6l7fqoea3#
类似于rgoers解决方案,但使用nashorn而不是groovy。此解决方案的优势在于Nashorn引擎是Java 8的一部分,因此不需要额外的依赖项。
请注意,每次发生Log4j事件时,
ScriptFilter
都会对脚本进行求值。因此,可以在运行时启用/禁用附加程序(通过更改系统属性的值),并且立即生效。另一方面,脚本求值可能会对事件记录性能产生负面影响。unhi4e5o4#
我无法单独通过配置文件找到解决方案,但我找到了一个通过编程解决问题的方法。
请注意,在我们的特定情况下,我们总是记录到“本地日志”(“splunk local”),但在给定情况下(由属性控制),我们还希望将相同的信息记录到另一个位置(不是相对位置),并定期读取和转发到splunk服务器(“splunk forwarder”)。
这就是为什么我们可以将大部分属性从一个记录器复制到另一个记录器。
如果有人知道如何通过配置文件单独做到这一点,这将是伟大的。
mec1mxoz5#
处理此问题的方法是使用筛选器。在这种情况下,可以使用脚本筛选器。
w6mmgewl6#
基于本文中的一些想法,下面是我对有条件地登录到控制台所做的工作。
用例示例
1.始终记录到文件附加程序。
1.仅在某些环境中登录到控制台。
溶液
additional.log.appender=console
${sys:additional.log.appender:-null}
。系统属性
日志4j2.xml文件