在记录期间屏蔽 Java 中的某些字符串属性?

Mask certain string attributes in Java during logging?

有没有一种方法可以屏蔽 class 的某些字符串变量,如密码等,这将在记录期间阻止?就像以这种方式覆盖 toString() 方法一样,它不会在日志中打印。

例如,我们有一个 class 具有以下字段的员工:

public class Employee {
    private String username;
    **private String password; //mask this field**
    private String city;
}

在记录期间

LOGGER.INFO("printing object:"+员工);

在日志记录中,我试图打印整个对象,这里是 Employee,我的要求是 根本不打印出屏蔽字段、密码 而日志记录其余字段都很好。

创建一个名为 MaskedString 的 class,它基本上只是 String 的替代品,但有一个不输出实际密码的 toString 方法:

public class MaskedString(){
    private String maskedString;

    MaskedString(){
        maskedString = "";
    }

    MaskedString(String string){
        maskedString = string;
    }

    public String getActualString(){
        return maskedString;
    }

    public String setString(String string){
        maskedString = string;
    }

    public String toString(){
        return "Not the actual string!";
    }
}

第一个明显的选择是覆盖 toString(),示例:

public class Employee {
    private String username;
    private String password;
    private String city;

    @Override
    public String toString() {
        return "username=" + username + " city=" + city;

    }

    public static void main(String[] args) {
        System.out.println(new Employee().toString());
    }
}

您也可以从日志中替换密码字符串,例如

 String maskedPassword = s.replaceAll("password=[^&]*", "password=***");

在您使用球衣时,您可以添加 logging filter 这样的替换。

如果您使用的是 lombok,请尝试使用 ToString 的排除选项。

@Data
@ToString(exclude = {"password"})
public class Employee {
    private String username;
    private String password;
    private String city;
}