欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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”字段的数据值就会被替换成“********”