目录
一、日志脱敏
1.logback转换器实现日志脱敏
创建自定义转换器
logback自定义转换器不需要修改原来代码,在日志打印时可以对参数自动处理,可维护性强。logback官方文档convert转换器介绍
创建自定义转换类MySampleConverter, 继承MessageConverter类,并实现convert方法。
java
import ch.qos.logback.classic.pattern.MessageConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
public class MySampleConverter extends MessageConverter {
public String convert(ILoggingEvent event) {
return event.getFormattedMessage();
}
}
让我们来看一下event里面是什么

介不就是格式化后的日志吗!怎么改呢?加密算法可以自己选。
比如这样:
java
public class MySampleConverter extends MessageConverter {
@Override
public String convert(ILoggingEvent event) {
String formattedMessage = event.getFormattedMessage();
//TODO 1.找到FormattedMessage中idNum的位置
//TODO 2.获取idNum的值并进行MD5加密 DigestUtils.md5DigestAsHex("".getBytes());
//TODO 3.将加密后的值替换到原来的位置
return formattedMessage;
}
}
或者这样:
java
public class MySampleConverter extends MessageConverter {
@Override
public String convert(ILoggingEvent event) {
//TODO 1.获取需要格式化的参数数组
Object[] argumentArray = event.getArgumentArray();
if (null != argumentArray) {
//TODO 2.循环对数组中的idNum加密 DigestUtils.md5DigestAsHex("".getBytes());
//TODO 3.将加密后的数组进行格式化
return MessageFormatter.arrayFormat(event.getMessage(), argumentArray).getMessage();
} else {
return event.getFormattedMessage();
}
}
}
就是提供个思路,长得帅的哥们自己琢磨吧。
logback.xml追加conversionRule配置
XML
<!-- 当前配置一定要加到第一行,放到下面会不生效 -->
<conversionRule conversionWord="msg" converterClass="com.api.filter.MySamepleConverter"></conversionRule>
2.FASTJSON序列化实现日志脱敏
toJSONString方法介绍
我们打印日志的时候会用JSON.toJSONString() 对对象进行序列化,要不然打印出来的就是一串看不懂的内存地址。可以看到toJSONString的方法的参数可以传SerializeFilter接口。

看下SerializeFilter接口的实现类都有哪些,显然这个ValueFilter可以对要序列化的值进行过滤。

创建自定义过滤器
我们只需要自定义一个SimpleValueFilter类,实现ValueFilter接口,重写process方法,匹配到需要加密的字段进行加密返回即可。
java
/**
* @author xrh
* @date 2022-09-21
* @description 打印日志时对敏感信息加密
*/
public class SimpleValueFilter implements ValueFilter {
private List filterName = Arrays.asList("idNum", "certNo");
@Override
public Object process(Object obj, String name, Object value) {
try {
if (filterName.contains(name)) {
return DigestUtils.md5DigestAsHex(value.toString().getBytes());
}
} catch (Exception e) {
return value;
}
return value;
}
private static final SimpleValueFilter simpleValueFilter = new SimpleValueFilter();
public static SimpleValueFilter getInstance() {
return simpleValueFilter;
}
}
java
Personal personal = new Personal();
personal.setIdNum("4112723199909083216");
log.info("查询个人信息结果:{},当前用户:{}", JSON.toJSONString(personal,SimpleValueFilter.getInstance()), "xrh");