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
相关产品推荐
相关产品推荐

