如何使用 logback 屏蔽数据

时间:2021-05-05 09:19:58

标签: spring logback

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="com.pattern.MaskingPatternLayout">
                            <patternsProperty>[a-zA-Z_]</patternsProperty>
            <pattern>%-5level - %replace(%msg){'[1-6][0-9]{3}[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}|5[1-5][0-9]{2}[\s-]?[0-9]{4}[\s-]?[0-9]{4}[\s-]?[0-9]{4}', 'XXXX'}%n</pattern>
        </layout>
    </encoder>
</appender>

我可以通过这种方式屏蔽数据,我不觉得这里有什么困难。但是我的项目已经使用了 ConsoleAppender,并且隐藏在新 appender 中的数据在旧 appender 中可见,所以我试图将数据隐藏在新 appender 中。这就是问题所在。

我项目中的旧 appender。

<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <pattern class="com.pattern.RFC5424JsonProvider">
                <pattern>
                    {
                        
                        "structured-data": "#asJson{%data}",
                        "msg": "%message"
                    }
                </pattern>
            </pattern>
        </providers>
    </encoder>
</appender>

RFC5424JsonProvider 扩展了 PatternLayout。如何隐藏旧 appender 中的数据?例如,地图 1111-2222-3333-444 应该用 * 隐藏。提前致谢

更新

public class MaskingPatternLayout extends PatternLayout {
private String patternsProperty;
private Optional<Pattern> pattern;

public String getPatternsProperty() {
    return patternsProperty;
}

public void setPatternsProperty(String patternsProperty) {
    this.patternsProperty = patternsProperty;
    if (this.patternsProperty != null) {
        this.pattern = Optional.of(Pattern.compile(patternsProperty, Pattern.MULTILINE));
    } else {
        this.pattern = Optional.empty();
    }
}

@Override
public String doLayout(ILoggingEvent event) {
    final StringBuilder message = new StringBuilder(super.doLayout(event));

    if (pattern.isPresent()) {
        Matcher matcher = pattern.get().matcher(message);
        while (matcher.find()) {

            int group = 1;
            while (group <= matcher.groupCount()) {
                if (matcher.group(group) != null) {
                    for (int i = matcher.start(group); i < matcher.end(group); i++) {
                        message.setCharAt(i, '*');
                    }
                }
                group++;
            }
        }
    }
    return message.toString();
}

}

0 个答案:

没有答案