Кодировщик обратного входа Logstash, не маскирующий вложенное поле

#json #logging #logstash #logback #logstash-logback-encoder

Вопрос:

Я пытаюсь использовать поля MaskingJsonGeneratorDecorator для маскировки во вложенном объекте, добавленном к сообщению журнала, используя этот Markers.appendRaw("body": <my-json-value>) метод.

Примером такой строки JSON является

 {"timestamp":"2021-10-26T22:41:29.471 02:00","message":"Response GET /examples/ ","level":"INFO", "body":[{"id":1,"password": "ABC"},{"id":2,"password":"DEF"},{"id":3,"password":"my-super-secure-password"}]"}
 

Я настроил logback-spring.xml файл таким образом

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">

            <jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator">

                  <defaultMask>****</defaultMask>

                  <path>password</path>

                  <!-- I've also tried /body/*/password, or */password -->

            </jsonGeneratorDecorator>

            <fieldNames>
                <timestamp>timestamp</timestamp>
                <message>message</message>
                <version>[ignore]</version>
                <levelValue>[ignore]</levelValue>
            </fieldNames>

        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>
 

Ожидаемый результат будет:

 {"timestamp":"2021-10-26T22:41:29.471 02:00","message":"Response GET /examples/ ","level":"INFO", "body":[{"id":1,"password": "****"},{"id":2,"password":"****"},{"id":3,"password":"****"}]"}
 

Но у меня нет никакой маскировки на месте.

Я попытался отладить код, и кажется, что PathBasedFieldMasker класс не может детализировать body объект.

В качестве временного решения я создал класс, который маскирует строку JSON перед регистрацией, но мне это кажется неоптимальным.

Что-нибудь, что я должен сделать, чтобы маскировка выполнялась правильно во вложенных полях?

Ответ №1:

Маскировка не предназначена для работы с Markers.appendRaw ней . При использовании Markers.appendRaw приложение берет на себя полную ответственность за предоставление точного JSON для вывода. Другими словами, logstash-logback-encoder вообще не обрабатывает значение, переданное в appendRaw.

У вас есть несколько вариантов, чтобы заставить маскировку работать…

Вариант 1: вместо использования appendRaw позвольте logstash-logback-encoder сериализовать значение, передав объект или массив одному из других методов append *. Это приведет к тому, что logstash-logback-encoder сериализует объект / массив в JSON. Именно во время этого процесса сериализации происходит маскировка.

Вариант 2: используется MaskingJsonGenerator для генерации замаскированного значения для передачи appendRaw .