我正在尝试使用
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'
正如您已经注意到的,用于将一组属性转换为 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