#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
.