Logback
Logback是 Java 社区中使用最广泛的日志记录框架之一。它是其前身 Log4j 的替代品。它提供了比 Log4j 更快的实现,并且提供了更多的配置选项和更灵活的归档旧日志文件。
敏感数据是任何旨在防止未经授权访问的信息。这可以包括从个人身份信息 (PII)(如社会安全号码)到银行信息、登录凭据、地址、电子邮件等的任何内容。
在我们的应用程序中登录时,我们将屏蔽属于用户的敏感数据。
假设我们在 Web 请求的上下文中记录用户详细信息。我们需要屏蔽与用户相关的敏感数据。假设我们需要输出下面的log:
log.info("name:{}, password:{}", "testuser", "123456");
log.error("name:testuser, token:12345adsfkdsahkjfsa6");
log.error("name:testuser, token : 12345adsfkdsahkjfsa6, password =nihflhsadfhisahfihsad");
log.info("name: {}, password: {} {}", 1, "sadfhkjsahfsadfsakj", 1);
PatternLayout
配置背后的想法是用自定义布局扩展我们需要的每个 Logback appender。在我们的例子中,我们将编写一个MaskingPatternLayout类作为 PatternLayout 的实现。每个掩码模式代表匹配一种类型的敏感数据的正则表达式。
让我们构建MaskingPatternLayout类:
public class MaskingPatternLayout extends PatternLayout {
private final Pattern pattern = Pattern.compile("(token|password)\\s*(:|=|[\\(\\)])([^,]*)(\\s<|,)");//enc(
@Override
public String doLayout(ILoggingEvent event) {
return maskMessage(super.doLayout(event));
}
private String maskMessage(String message) {
String result = "";
try {
StringBuilder sb = new StringBuilder(message);
Matcher matcher = pattern.matcher(sb);
while (matcher.find()) {
result = this.encrptFormat(String.valueOf(sb));
}
return result;
}catch (Exception e){
log.error(e.toString());
}
return result;
}
encrptFormat
方法定义自己需要log的改变的代码
加密算法:
public String encrptFormat(String log) {
Matcher matcher = pattern.matcher(log);
while (matcher.find()) {
String matchedString = matcher.group(3);
String encrypt = this.encryptLog(matchedString);
String groupz = matcher.group(0);
String groupo = matcher.group(1);
if(StringUtils.isNotEmpty(groupo)&&StringUtils.isNotEmpty(matchedString)){
String sigone = this.encryptKey(groupo);
String sig = groupz.replace(matchedString, encrypt)
.replace(groupo,sigone);
log = log.replace(matcher.group(0), sig);
}
}
return log;
}
private String encryptLog(String log) {
String res = "";
if (StringUtils.isNotBlank(log)) {
int size = log.length();
if (size <= 10) {
res = "**********";
} else {
int half = size / 2;
res = log.substring(0, half);
res = StringUtils.rightPad(res, size, "*");
}
}
return res;
}
private String encryptKey(String key) {
String result = "";
if (StringUtils.isNotBlank(key)) {
int length = key.length();
result = key.charAt(0) + "***" + key.charAt(length - 1);
}
return result;
}
logback.xml
我们将在logback.xml文件中的maskPattern标签中添加这些正则表达式模式:
<configuration>
<appender name="mask" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.baeldung.logback.MaskingPatternLayout">
<pattern>%-5p [%d{ISO8601,UTC}] [%thread] %c: %m%n%rootException</pattern>
</layout>
</encoder>
</appender>
</ configuration>
输出
执行后,我们可以看到输出:
name:testuser, p***d:**********
name:testuser, t***n:12345adsfk**********
name:testuser, t***n : 12345adsf***********, p***d =nihflhsadf***********