You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Logback框架下实现邮箱30%脱敏的正则表达式求助

Logback邮箱PII脱敏(按30%比例)配置方案

一、快速匹配示例场景(固定保留前3字符)

如果你的需求和示例一致(如testing@test.com→tes***@test.com),直接用Logback内置的%replace功能即可,无需自定义代码。

核心配置片段

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- 替换为你的实际Appender类型,如FileAppender -->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %replace(%msg){'([a-zA-Z0-9._%+-]{3})[a-zA-Z0-9._%+-]*(@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})', '$1***$2'}%n</pattern>
    </encoder>
</appender>

正则逻辑

  • ([a-zA-Z0-9._%+-]{3}):捕获邮箱本地部分(@前)的前3个合法字符(符合RFC邮箱规范)
  • [a-zA-Z0-9._%+-]*:匹配本地部分剩余的所有字符
  • (@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}):完整捕获@后的域名部分
  • 替换规则:保留前3字符 + *** + 完整域名,实现脱敏效果

二、严格按30%比例动态脱敏

如果需要精准脱敏本地部分的30%(即保留70%字符,动态适配不同长度的邮箱),纯正则无法实现动态长度计算,需要自定义Logback Converter:

1. 编写自定义Converter类

import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmailMaskConverter extends ClassicConverter {
    private static final Pattern EMAIL_REGEX = Pattern.compile("([a-zA-Z0-9._%+-]+)(@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})");

    @Override
    public String convert(ILoggingEvent event) {
        String logMsg = event.getMessage();
        Matcher matcher = EMAIL_REGEX.matcher(logMsg);
        StringBuilder result = new StringBuilder();
        
        while (matcher.find()) {
            String localPart = matcher.group(1);
            String domain = matcher.group(2);
            
            // 计算保留长度:70%比例,至少保留1个字符
            int keepLen = (int) Math.round(localPart.length() * 0.7);
            keepLen = Math.max(keepLen, 1);
            
            String maskedLocal = localPart.substring(0, keepLen) + "***";
            matcher.appendReplacement(result, maskedLocal + domain);
        }
        matcher.appendTail(result);
        return result.toString();
    }
}

2. Logback配置中注册并使用

<configuration>
    <!-- 注册自定义转换器,替换为你的实际包路径 -->
    <conversionRule conversionWord="maskEmail" converterClass="com.yourcompany.util.EmailMaskConverter" />

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>/var/log/app.log</file>
        <encoder>
            <!-- 使用%maskEmail处理日志消息中的邮箱 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %maskEmail(%msg)%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE" />
    </root>
</configuration>

关键说明

  • 动态计算保留长度:按本地部分长度的70%取整,确保脱敏比例为30%
  • 边界处理:避免本地部分过短时全脱敏,至少保留1个字符
  • 全局匹配:自动处理日志消息中所有出现的邮箱地址

排查小贴士

  • 正则失效:XML中反斜杠需转义为\\,比如匹配点号要用\\.而非\.
  • 匹配不全:扩展正则字符集以覆盖特殊邮箱(如含+、_的地址)
  • 转换器不生效:确认类包路径正确,打包时未遗漏该类

内容的提问来源于stack exchange,提问作者erama035

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:57:33