zoukankan      html  css  js  c++  java
  • 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标识(不加入其他依赖)

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

  • 相关阅读:
    HDU4385Moving Bricks【状压DP】
    用位运算实现加减法
    hdu 1874(最短路 Dilkstra +优先队列优化+spfa)
    codeforces 782B The Meeting Place Cannot Be Changed+hdu 4355+hdu 2438 (三分)
    hdu 1542(线段树+扫描线 求矩形相交面积)
    hdu 2602(经典01背包)
    hdu 1698(线段树区间更新)
    hdu 1754(单点更新 ,区间最大值)
    NYOJ 寻找最大数
    hdu 2222(AC自动机模版题)
  • 原文地址:https://www.cnblogs.com/10fly/p/9876974.html
Copyright © 2011-2022 走看看