在记录期间屏蔽 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;
}
有没有一种方法可以屏蔽 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;
}