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标识(不加入其他依赖)
项目启动时,异步调用静态方法。不是什么好方案,但是能简单解决问题。