Logstash logback encoder无法掩码嵌套字段该如何解决?
问题根因
MaskingJsonGeneratorDecorator默认仅遍历日志的结构化JSON字段做掩码匹配,你通过Markers.appendRaw()传入的body是原始JSON字符串类型,编码器不会主动解析字符串内部的JSON结构,因此无法匹配到嵌套的password字段。
解决方法
方案1(更推荐):使用结构化传值
将Markers.appendRaw("body", json字符串)替换为Markers.appendObject("body", 对应Java对象),直接传入结构化的body对象,让编码器完成整体序列化,此时装饰器可完整遍历所有层级字段。
对应配置匹配路径:
<path>/body/*/password</path>
方案2(保留appendRaw用法):开启原始值解析
如果必须使用appendRaw,只需在装饰器配置中添加parseRawValues属性开启raw字符串内部解析即可,修改后的完整配置如下:
<?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> <!-- 开启对raw类型值的JSON解析 --> <parseRawValues>true</parseRawValues> <!-- 匹配body数组下所有元素的password字段 --> <path>/body/*/password</path> <!-- 如需全局匹配所有层级的password字段,可改用下方配置 --> <!-- <path>**/password</path> --> </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>
两种方案都可以实现你预期的掩码效果。
内容的提问来源于stack exchange,提问作者Kerruba
相关产品推荐
相关产品推荐

