У меня есть веб-служба Java, работающая на Spring Boot 2 и JDK 11, которая использует Logback через файл шаблона в общей библиотеке. Я использую тег <nestedField>
для размещения некоторых свойств Logback по умолчанию в местах, соответствующих Elasti c Common Schema, а также в местах, указанных в стандартах моей организации. К сожалению, мне не удалось вложить свойство более чем на один уровень в результате JSON. Позвольте мне проиллюстрировать.
Файл шаблона в общей библиотеке выглядит примерно так:
<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>