log4j2通过PatternLayout机制实现日志敏感字段脱敏
程序员文章站
2022-07-05 18:11:09
...
1、首先了解一下 正则表达式:.*,.*?,.+?的匹配方式
public static void main(String[] args) {
String content ="hello world";
String param1 = ".*";
String param2 = "hell.*?o";
String param3 = "hel.+?l";
Pattern p1 = Pattern.compile(param1);
Pattern p2 = Pattern.compile(param2);
Pattern p3 = Pattern.compile(param3);
Matcher m1 = p1.matcher(content);
if (m1.find()){
for (int i = 0; i <=m1.groupCount() ; i++) {
System.out.println("p1--------------"+m1.group(i));
}
}
Matcher m2 = p2.matcher(content);
if (m2.find()){
for (int i = 0; i <=m2.groupCount() ; i++) {
System.out.println("p2--------------"+m2.group(i));
}
}
Matcher m3 = p3.matcher(content);
if (m3.find()){
for (int i = 0; i <=m3.groupCount() ; i++) {
System.out.println("p3--------------"+m3.group(i));
}
}
}
执行结果为:
p1--------------hello world
p2--------------hello
p3--------------hello worl
可以得出以下总结:
.*:匹配所有内容,如果是“h.*d”则输出为“hello world”,.
表示 匹配除换行符 \n 之外的任何单字符,*
表示零次或多次。
hell.*?o:匹配从“hell”开始到“o”首次出现的位置的内容,加“?”表示懒惰模式,就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
hel.+?l:匹配从“hel”开始到“l”最后出现的位置的内容。
2、了解以上匹配机制之后就可以在log4j的xml文件中配置敏感资源的替换脱敏了
<!-- PatternLayout的pattern配置
%replace{%replace{[%m]}{"passwd":".*?"}{"passwd":"***"}}{"account":".*?"}{"account":"***"}
这一段为替换规则,达到的效果是按照正则匹配把json报文中的"passwd":"778password"和"account":"778account"替换为"passwd":"***"和"account":"***"
正则表达式根据需求自己定义
-->
<property name="test">
<![CDATA[ [%-5level][%d{yyyy-MM-dd HH:mm:ss,SSS}][%t][%c][%X{busi_seq}][%X{sys_seq}][%C{1}:%L]: %replace{%replace{[%m]}{"passwd":".*?"}{"passwd":"***"}}{"account":".*?"}{"account":"***"}%n ]]>
</property>
最终在日志里面存在“passwd”和“account”字段的数据值就会被替换成“********”