logback对指定字段进行脱敏或过滤

        由于对象中有些字段过大,比如base64字符串,打印出来非常占用空间,所以想要对指定字段日志进行过滤。

实现的逻辑是通过正则表达式对日志进行匹配,如果存在需要过滤的字段, 则对字段后的值进行替换。

第一步:

新建一个类继承PatternLayout,重写doLayout方法。在该方法中实现替换或脱敏逻辑。

package com.a.b.c.conf;


import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * @program: kangaroo
 * @description: 指定字段过滤
 * @author: long
 * @create: 2024-01-24 18:26
 **/
public class MaskingPatternLayout extends PatternLayout {


    private Pattern multilinePattern;
    private List<String> maskPatterns = new ArrayList<>();

    public void addMaskPattern(String maskPattern) {
        maskPatterns.add(maskPattern);
        multilinePattern = Pattern.compile(maskPatterns.stream().collect(Collectors.joining("|")), Pattern.MULTILINE);
    }


    @Override
    public String doLayout(ILoggingEvent event) {
        return maskMessage(super.doLayout(event));
    }

    private String maskMessage(String message) {
        if (multilinePattern == null) {
            return message;
        }
        StringBuilder sb = new StringBuilder(message);
        Matcher matcher = multilinePattern.matcher(sb);
        while (matcher.find()) {
            IntStream.rangeClosed(1, matcher.groupCount()).forEach(group -> {
                if (matcher.group(group) != null) {
                    // 全部替换为*
                    IntStream.range(matcher.start(group), matcher.end(group)).forEach(i -> sb.setCharAt(i, '*'));
                }
            });
        }
        if (StringUtils.isNotBlank(sb.toString())) {
            //将所有*替换成一个*号
            return sb.toString().replaceAll("\\*+", "*");
        }
        return sb.toString();
    }

}

第二步:

修改logback配置文件,encoder需要指定class为ch.qos.logback.core.encoder.LayoutWrappingEncoder,layout指定刚刚自定义的layout类。然后在maskPattern中指定需要过滤或脱敏的字段。

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    <layout class="com.a.b.c.conf.MaskingPatternLayout">
        <maskPattern>\"userName\"\s*:\s*\"(.*?)\"</maskPattern>
        <maskPattern>\"telephone\"\s*:\s*\"(.*?)\"</maskPattern> 
        <pattern>${PATTERN}</pattern>
    </layout>
    <charset>utf8</charset>
</encoder>

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值