我有一个在 Spring Boot 2 和 JDK 11 上运行的 Java Web 服务,它通过公共(public)库中的模板文件使用 Logback。我正在使用<nestedField>
标记以将一些默认 Logback 属性放置在符合 Elastic Common Schema 的位置以及由我的组织标准指定的位置。不幸的是,我未能成功地将属性嵌套在生成的 JSON 中的多个级别上。请允许我举例说明。
公共(public)库中的模板文件如下所示:
<included>
<appender name="MACHINE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp/>
<nestedField>
<fieldName>log</fieldName>
<providers>
<loggerName>
<fieldName>logger</fieldName>
</loggerName>
<logLevel>
<fieldName>level</fieldName>
</logLevel>
</providers>
</nestedField>
<message/>
<pattern>
<omitEmptyFields>true</omitEmptyFields>
<pattern>
<!--@formatter:off-->
{
"lots-of-other-MDC-fields-here": {...}
}
<!--@formatter:on-->
</pattern>
</pattern>
</providers>
</encoder>
</appender>
</included>
生成的 JSON 类似于:
{
"log": {
"logger": "...",
"level: "INFO"
},
"message": "...",
"lots-of-other-MDC-fields-here": {...}
}
但是,并非所有字段都只嵌套一层。在最外面<providers>
上面的标签我想添加以下内容:
<nestedField>
<fieldName>extra</fieldName>
<providers>
<nestedField>
<fieldName>keywords</fieldName>
<stackHash>
<fieldName>stack_hash</fieldName>
<exclusions>${STE_EXCLUSIONS}</exclusions>
</stackHash>
</nestedField>
</providers>
</nestedField>
这应该呈现为:
{
"log": {
"logger": "...",
"level: "INFO"
},
"extra": {
"keywords": {
"stack_hash": "something here"
}
},
"message": "...",
"lots-of-other-MDC-fields-here": {...}
}
不幸的是,当我嵌套时,我没有做正确的事情 <nestedField>
下一个 <nestedField>
我没有找到任何适用的文档或示例来说明如何正确完成此操作。我正在寻找有关如何获取示例中提供的配置以呈现为上述输出的清晰示例。
上面例子的实际输出是:
Exception in thread "main" java.lang.IllegalStateException: Logback configuration error detected:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@67:40 - no applicable action for [stackHash], current ElementPath is [[configuration][appender][encoder][providers][nestedField][providers][nestedField][stackHash]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@69:45 - no applicable action for [exclusions], current ElementPath is [[configuration][appender][encoder][providers][nestedField][providers][nestedField][stackHash][exclusions]]
对于上下文,以下是我的服务如何使用已部署的模板:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProfile name="deployed-mode">
<include resource="com/.../logging/logback/my-logback-template.xml"/>
<root level="INFO">
<appender-ref ref="MACHINE"/>
</root>
</springProfile>
</configuration>
最佳答案
显然上面的格式是有效的,logstash 编码器中一定存在错误。我无法确定该错误在哪里,因为它自行解决了。目前使用logstash编码器6.2。如果有人更准确地知道如何修复此错误,我会接受该答案。
关于java - Logback:通过 <nestedField> 进行双重嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122441/