本文已参与「新人创作礼」活动,一起开启掘金创作之路。
首先要写脱敏类,如下
@Slf4j
public class SensitiveDataConverter extends MessageConverter {
private static Pattern idCardPattern = Pattern.compile("(\\D)(\\d{6})([19,20]\\d{7})(\\d{3}[0-9Xx])(\\D)");
private static Pattern bankCardPattern = Pattern.compile("(\\D)([3-6]\\d{3})(\\d{8,12})(\\d{4})(\\D)");
private static Pattern mobilePattern = Pattern.compile("(\\D)([13,14,15,16,17,18,19]\\d{2})(\\d{4})(\\d{4})(\\D)");
private static Pattern namePattern = Pattern.compile("([^\\u4e00-\\u9fa5])([\\u4e00-\\u9fa5])([\\u4e00-\\u9fa5]{1,3})([^\\u4e00-\\u9fa5])");
@Override
public String convert(ILoggingEvent event){
try {
String oriLogMsg = event.getFormattedMessage();
return deSensitiveData(oriLogMsg);
}catch (Exception e){
log.error("[数据脱敏失败]",e);
return super.convert(event);
}
}
/**
* 处理日志字符串,返回脱敏后的字符串
* @param oriMsg
* @return
*/
private String deSensitiveData(final String oriMsg){
String s1 = idCardPattern.matcher(oriMsg).replaceAll("$1$2********$4$5");
String s2 = bankCardPattern.matcher(s1).replaceAll("$1$2********$4$5");
String s3 = mobilePattern.matcher(s2).replaceAll("$1$2****$4$5");
return namePattern.matcher(s3).replaceAll("$1$2**$4");
}
}
其次在logback中加入相应配置
<configuration scan="true">
<!-- 指定脱敏类的位置 -->
<conversionRule conversionWord="msg" converterClass="com.aspect.SensitiveDataConverter"/>
</configuration>