Logstash logback 编码器不屏蔽嵌套字段
Logstash logback encoder not masking nested field
我正在尝试使用 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
class 无法向下钻取 body
对象。
作为临时解决方案,我构建了一个 class 在记录之前屏蔽 JSON 字符串,但它对我来说似乎不是最佳选择。
我应该做些什么来使掩码在嵌套字段中正确发生?
遮罩不适用于 Markers.appendRaw
。使用 Markers.appendRaw
时,应用程序将全权负责提供准确的 JSON 输出。换句话说,logstash-logback-encoder 根本不处理传递给 appendRaw 的值。
您有几个选项可以使遮罩工作...
选项 1:不使用 appendRaw,而是让 logstash-logback-encoder 通过将对象或数组传递给其他 append* 方法之一来序列化值。这将导致 logstash-logback-encoder 将 object/array 序列化为 JSON。正是在这个序列化过程中发生了屏蔽。
选项 2:使用 MaskingJsonGenerator
生成要传递给 appendRaw
的屏蔽值。
我正在尝试使用 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
class 无法向下钻取 body
对象。
作为临时解决方案,我构建了一个 class 在记录之前屏蔽 JSON 字符串,但它对我来说似乎不是最佳选择。
我应该做些什么来使掩码在嵌套字段中正确发生?
遮罩不适用于 Markers.appendRaw
。使用 Markers.appendRaw
时,应用程序将全权负责提供准确的 JSON 输出。换句话说,logstash-logback-encoder 根本不处理传递给 appendRaw 的值。
您有几个选项可以使遮罩工作...
选项 1:不使用 appendRaw,而是让 logstash-logback-encoder 通过将对象或数组传递给其他 append* 方法之一来序列化值。这将导致 logstash-logback-encoder 将 object/array 序列化为 JSON。正是在这个序列化过程中发生了屏蔽。
选项 2:使用 MaskingJsonGenerator
生成要传递给 appendRaw
的屏蔽值。