logback日志脱敏

     

     日志脱敏指的是:手机号,银行卡号,IP,邮箱,身份证号等敏感信息进行混淆~

  跟踪源代码发现在LoggingEvent中进行的数据处理

 getFormattedMessage 方法里添加正则表达式替换

 1  private String getMessageByPattern(String inputMessage){
 2         try{
 3             long beginTime = new Date().getTime();
 4             /******************************手机号正则开始*****************************/
 5             String phone = "(:|=)[^a-zA-Z]?(13|14|15|17|18|19)[0-9]{9}";
 6             Pattern ptPhone = Pattern.compile(phone);  
 7             // 用于测试的输入字符串
 8             //System.out.println("Input:" + inputMessage);
 9             inputMessage = matchAndReplace(inputMessage, ptPhone);
10            /******************************手机号正则结束*****************************/
11             
12            /******************************身份证号正则开始*****************************/
13             String idcard = "(:|=)[^a-zA-Z]\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/";
14             Pattern ptCard = Pattern.compile(idcard);
15             inputMessage = matchAndReplace(inputMessage, ptCard);
16             
17             /******************************邮箱正则开始*****************************/
18             String email = "(:|=)[^a-zA-Z]\w[-\w{1,2}]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}";
19             Pattern ptemail = Pattern.compile(email);
20             inputMessage = matchAndReplace(inputMessage, ptemail);
21             
22             /******************************银行卡号正则开始*****************************/
23             String bankcard = "(:|=)[^a-zA-Z]([1-9]{1})(\d{12,18})";
24             Pattern ptcard = Pattern.compile(bankcard);
25             inputMessage = matchAndReplace(inputMessage, ptcard);
26             
27             /******************************IP正则开始*****************************/
28             StringBuffer ip = new StringBuffer("(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.");
29 
30             ip.append("(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.");
31 
32             ip.append("(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.");
33 
34             ip.append("(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)");
35             Pattern ptip = Pattern.compile(ip.toString());
36             inputMessage = matchAndReplace(inputMessage, ptip);
37             
38             long endTime = new Date().getTime();
39         }catch(Exception e){
40             e.printStackTrace();
41             return "";
42         }
43         return inputMessage;
44     }
45     private static String matchAndReplace(String inputPhone,Pattern p){
46          Matcher m = p.matcher(inputPhone);
47          while(m.find()){
48                 // System.out.println(m.group());
49                 String value = m.group();
50                 String replace = "";
51                 if(value.length() <=11){
52                    replace = value.substring(0,4)+"***"+value.substring(8, value.length());
53                 }else{
54                     replace = value.substring(0,5)+"*****"+value.substring(11, value.length());
55                 }
56                 inputPhone = inputPhone.replaceAll(value, replace);
57                 //System.out.println(inputPhone);
58         }
59          return inputPhone;
60     }
61     
62     public static void init() {
63          while(true){
64             //动态读取根目录下的文件,取值并且赋值,睡眠10分钟
65              try {
66                 Thread.sleep(sleepTime);
67                 File file = new File(System.getProperty("user.dir")+File.separator+"logOff.txt");
68                 if(file.exists()){
69                     //定义一个fileReader对象,用来初始化BufferedReader
70                     FileReader reader = new FileReader(file);
71                     //new一个BufferedReader对象,将文件内容读取到缓存
72                     BufferedReader bReader = new BufferedReader(reader);
73                     //定义一个字符串缓存,将字符串存放缓存中
74                     StringBuilder sb = new StringBuilder();
75                     String s = "";
76                   //逐行读取文件内容,不读取换行符和末尾的空格
77                     while ((s =bReader.readLine()) != null) {
78                         //将读取的字符串添加换行符后累加存放在缓存中
79                         sb.append(s);
80                     }
81                     bReader.close();
82                     String str = sb.toString();
83                     flag = str;
84                 }
85                  System.out.println("是否开启日志:"+flag);
86             } catch (Exception e) {
87                 e.printStackTrace();
88             }
89          }
90     }

可以把此文件拷贝出来,然后修改getFormattedMessage()方法,放入项目中,注意包名,类名要保持一致。

JVM通过双亲委派模型进行类的加载,优先加载自定义类,所以可以达到覆盖源class文件的效果。

也可以覆盖jar包里的class文件,这样只需要更新下maven仓库就好

最后需要注意的是打包class文件的时候,jdk必须一致

日志控制开关:

LoggingEvent添加静态方法,每5分钟轮询一次,读取项目根路径下文件,获取true,fasle标识(不加入其他依赖)

项目启动时,异步调用静态方法。不是什么好方案,但是能简单解决问题。

原文地址:https://www.cnblogs.com/10fly/p/9876974.html