Logstash logback编码器不屏蔽嵌套字段



我试图使用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字符串,但它对我来说似乎不是最优的。

我应该做什么使屏蔽正确地发生在嵌套字段?

遮罩不是为Markers.appendRaw设计的。当使用Markers.appendRaw时,应用程序全权负责提供要输出的准确JSON。换句话说,logstash-logback-encoder根本不处理传递给appendRaw的值。

你有几个选项可以让屏蔽工作…

选项1:让logstash-logback-encoder通过将对象或数组传递给其他append*方法来序列化值,而不是使用appendRaw。这将导致logstash-logback-encoder将对象/数组序列化为JSON。在这个序列化过程中会发生屏蔽。

选项2:使用MaskingJsonGenerator生成遮罩值传递给appendRaw

相关内容

  • 没有找到相关文章

最新更新