我试图使用MaskingJsonGeneratorDecorator
来屏蔽使用Markers.appendRaw("body": <my-json-value>)
方法附加到日志消息的嵌套对象中的字段。
{"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