⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 medium.com 「网络」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

介绍

我们可以通过实现自定义日志附加程序并使用正则表达式来识别和屏蔽敏感信息,从而屏蔽 Spring Boot 应用程序的 log4j 日志中的敏感数据。以下是具体方法实战:

第1步:创建自定义日志 Appender

创建一个扩展 log4j 提供的 AppenderSkeleton 的类。这个自定义appender将在日志消息写入日志之前拦截它们,并应用必要的屏蔽。

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

public class MaskingAppender extends AppenderSkeleton {

@Override
protected void append(LoggingEvent loggingEvent) {
String message = loggingEvent.getMessage().toString();
String maskedMessage = maskSensitiveData(message);
loggingEvent.setMessage(maskedMessage);
super.append(loggingEvent);
}

@Override
public void close() {
// Cleanup resources, if any
}

@Override
public boolean requiresLayout() {
return false;
}

private String maskSensitiveData(String message) {
// Implement your logic to mask sensitive data using regular expressions
// For demonstration purposes, let's assume we want to mask credit card numbers
return message.replaceAll("\\d{4}-\\d{4}-\\d{4}-\\d{4}", "****-****-****-****");
}
}

log4j中的一个appender负责将日志消息写入各种输出中。通过扩展AppenderSkeleton类,我们创建了一个自定义appender,它可以在将日志消息写入日志之前对其进行修改。

正则表达式(regex)是用于模式匹配和操作字符串的强大模式。在maskSensitiveData()方法中,我们使用regex来识别和替换敏感数据。在示例中,我们使用模式\\d{4}-\\d{4}-\\d{4}-\\d{4}匹配格式为“xxxx-xxxx”的信用卡号,并将其替换为“-”。

append()方法

log4j在准备添加日志消息时调用此方法。在MaskingAppender类中,我们覆盖这个方法来拦截日志消息,使用maskSensitiveData()方法对敏感数据应用masking,然后将修改后的消息传递给超类的append()方法。

第2步:配置Log4j

在 Spring Boot 应用程序的配置文件中,我们需要配置 log4j 以使用自定义 Appender。我们还需要根据您的要求指定日志级别和其他设置。这是使用 application.properties 配置 log4j 的示例:

# Log4j configuration
log4j.rootLogger=INFO, maskedAppender

log4j.appender.maskedAppender=com.example.MaskingAppender
log4j.appender.maskedAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.maskedAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

第3步:包含 Log4j

确保在Spring Boot应用的构建文件中有必要的log4j依赖项(例如,Maven的pom.xml):

<!-- log4j dependencies -->
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>

第4步::测试日志屏蔽

现在,当我们在 Spring Boot 应用程序中使用 log4j 记录消息时,敏感数据将被自动屏蔽。例如:

import org.apache.log4j.Logger;

public class SomeService {
private static final Logger logger = Logger.getLogger(SomeService.class);

public void processSensitiveData(String data) {
logger.info("Processing sensitive data: " + data); // Sensitive data will be masked in the logs
}
}

在应用程序代码中,可以使用log4j提供的Logger来记录消息。在本例中,我们使用logger.info()记录一条消息。包含敏感数据的日志消息作为字符串连接传递。MaskingAppender拦截此消息并在将其写入日志之前应用掩码。

在上面的例子中,如果数据参数中包含类似“1234—5678—9012—3456”的信用卡号,那么它将在日志输出中被屏蔽为“正在处理敏感数据:——”

结论

通过遵循这些步骤和概念,可以有效地屏蔽Spring Boot应用程序log4j日志中的敏感数据。请记住根据我们的特定需求和敏感数据模式调整maskSensitiveData()方法中的掩码逻辑。

文章目录
  1. 1. 介绍
  2. 2. 第1步:创建自定义日志 Appender
    1. 2.0.1. append()方法
  • 3. 第2步:配置Log4j
  • 4. 第3步:包含 Log4j
  • 5. 第4步::测试日志屏蔽
  • 6. 结论