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標識(不加入其他依賴)

項目啟動時,異步調用靜態方法。不是什么好方案,但是能簡單解決問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM