Выход из системы: поле с двойным вложением через <nestedField> - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть веб-служба 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>

1 Ответ

0 голосов
/ 10 февраля 2020

Видимо, приведенный выше формат действителен, возможно, в кодировщике logsta sh произошла ошибка. Мне не удалось точно определить, где была эта ошибка, поскольку она устранена сама по себе. В настоящее время используется кодировщик logsta sh 6.2. Если кто-то знает более точно, что устраняет эту ошибку, я приму этот ответ.

...