我想在Logback appender的 Logstash 编码器中使用 Spring 环境值作为自定义字段。
有一个通用的配置标签来使用属性
<property resource="logstash.properties" />
Spring为此提供了一个特殊的配置标签
<springProperty name="appEnv" source="environment"/>
然后可以在Logstash 编码器的自定义字段中使用这两个标签的属性
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"application.environment":"${appEnv}"</customFields>
</encoder>
问题是,据我了解,这仅在某些情况下有效。问题大概是在Spring环境搭建的时候Logback已经配置好了。
它似乎在什么时候起作用
- 该属性是本地和静态的(在配置时可用)
- 该属性位于 bootstrap.properties
它似乎不起作用
- 从Spring 配置服务器检索时,该属性是动态的
我从配置服务器传递的属性值是null
在配置 Logback 时,因此日志将它们显示appEnv_IS_UNDEFINED
为一个名为appEnv
.
因为大多数示例只是使用spring.application.name
this 似乎几乎没有被注意到。
为了解决时间问题,我搜索了一种重新加载 Logback 配置 onApplicationEvent
的方法。我发现这个答案证实了我的问题并提供了一个框架解决方案。
我找到了其他解决方案,其中使用 Logstash 编码器的 Logback appender 完全以编程方式构建并添加到LoggerContext
.
但是,我想知道是否还有一种方法可以坚持使用 appender 的 XML 配置,并在 Spring 环境准备好时以编程方式“重新加载”配置。我该怎么做?
我找到了这个答案来重新加载,但它不适用于我的情况。appEnv_IS_UNDEFINED
继续出现在日志文件中。