日志脫敏指的是:手機號,銀行卡號,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標識(不加入其他依賴)
項目啟動時,異步調用靜態方法。不是什么好方案,但是能簡單解決問題。