如何在属性文件中配置具有多个AppenderRef的RewriteAppender?

问题描述 投票:0回答:1

我正在尝试使用

RewriteAppender
LogEvent
进行修改,然后将其传递给其他几个附加程序。 (我的环境需要所有配置才能使用属性文件。)

在查看

PropertiesConfigurationBuilder
方法
processRemainingProperties()
createComponent
中的代码时,不清楚如何配置它(如果可能的话)。

文档(https://logging.apache.org/log4j/2.x/manual/configuration.html#configuration-with-properties)有一个示例,其中包括:

logger.app.appenderRef.$1.ref = stdout
logger.app.appenderRef.$2.ref = file

我配置此数组的最新尝试是这样的:(注意复数“appenderRefs”,因为这是插件构建器参数名称)

# added for error "No type attribute for component appenderRefs"
appender.rewrite.appenderRefs.type = AppenderRef 
appender.rewrite.appenderRefs.stdout.type = AppenderRef
appender.rewrite.appenderRefs.stdout.ref = stdout
appender.rewrite.appenderRefs.file.type = AppenderRef
appender.rewrite.appenderRefs.file.ref = file

我期望将

appenderRefs
RewriteAppender 属性设置为具有两个元素的数组,但我得到以下 ConfigurationException:

Arguments given for element RewriteAppender are invalid: field 'appenderRefs' has invalid value '[Lorg.apache.logging.log4j.core.config.AppenderRef;@740fb309'
arrays configuration log4j2 properties-file
1个回答
0
投票

正如您已经注意到的,用于将一组属性转换为 XML 树的 general 规则进行了转换:

<parentPrefix>.<id1>.type = Component
<parentPrefix>.<id1>.foo = bar
<parentPrefix>.<id1>.<id2>.type = SubComponent
<parentPrefix>.<id1>.<id2>.bar = baz
<parentPrefix>.<id1>.<id3>.type = SubComponent

进入子树:

<Component foo="bar">
  <SubComponent bar="baz"/>
  <SubComponent/>
</Component>

因此假设

appender.rewrite
Rewrite
附加器的前缀,您可以使用:

appender.rewrite.stdout.type = AppenderRef
appender.rewrite.stdout.ref = stdout
appender.rewrite.file.type = AppenderRef
appender.rewrite.file.ref = file

为什么文档中的示例有效?

除了一般规则(用

processRemainingProperties
方法表示)之外,一些子树还有特殊规则。例如,以
logger.
开头的属性由
createLogger
解析,它接受您在文档中找到的语法:

logger.app.appenderRef.$1.ref = stdout
logger.app.appenderRef.$2.ref = file

但是接受:

logger.app.$1.type = AppenderRef
logger.app.$1.ref = stdout
logger.app.$2.type = AppenderRef
logger.app.$2.ref = file

备注:Log4j 的

3.x
版本将采用新的
log4j-config-properties
,并具有由
jackson-dataformat-properties
提供的连贯映射规则。根据这些新规则,您将能够编写:

Appenders.Rewrite.AppenderRef[1].ref = stdout
Appenders.Rewrite.AppenderRef[2].ref = file
© www.soinside.com 2019 - 2024. All rights reserved.