Spring Boot 3.4中如何对结构化日志中的敏感信息(如密码、API密钥等)进行脱敏?
Spring Boot 3.4中如何对结构化日志中的敏感信息(如密码、API密钥等)进行脱敏?
我之前也碰到过和你一模一样的问题!Spring Boot 3.4的结构化日志里,message字段确实有点特殊——你用StructuredLoggingJsonMembersCustomizer改不动它太正常了,因为这个Customizer本来就是用来添加、移除或修改额外的JSON成员的,而message属于日志的核心内容,有单独的处理流程,根本轮不到它来修改。
下面给你两个亲测有效的解决方案,按需选就行:
方法一:自定义结构化日志Formatter,直接改写message逻辑
这个方法专门针对结构化日志生效,不用改动Logback的核心配置,很适合只想处理结构化日志的场景:
- 创建自定义Formatter类,继承Spring提供的
JsonWriterStructuredLogFormatter,重写处理message的方法:
import org.springframework.boot.logging.structured.JsonWriterStructuredLogFormatter; import org.springframework.boot.logging.structured.StructuredLogEntry; public class MaskingJsonLogFormatter extends JsonWriterStructuredLogFormatter { // 这里可以根据你的需求调整正则,匹配所有需要脱敏的字段 private static final String SENSITIVE_PATTERN = "(password|apiKey|token|secret)=\\S+"; private static final String MASK_REPLACEMENT = "$1=***MASKED***"; @Override protected String formatMessage(StructuredLogEntry entry) { // 先拿到原始的message内容 String originalMessage = super.formatMessage(entry); // 用正则替换敏感内容 return originalMessage.replaceAll(SENSITIVE_PATTERN, MASK_REPLACEMENT); } }
- 配置使用自定义Formatter,在
application.yml或者application.properties里指定:
spring: logging: structured: formatter: com.your.package.MaskingJsonLogFormatter # 换成你的类全路径
这样Spring Boot就会用你自定义的Formatter来生成结构化日志,message里的敏感内容会被自动替换成***MASKED***。
方法二:用Logback的消息转换器,全局脱敏所有日志
如果你希望不管是结构化日志还是普通文本日志,都能统一脱敏敏感内容,那用Logback的MessageConverter更合适:
- 创建自定义消息转换器:
import ch.qos.logback.classic.pattern.MessageConverter; import ch.qos.logback.classic.spi.ILoggingEvent; public class SensitiveDataMaskingConverter extends MessageConverter { private static final String SENSITIVE_PATTERN = "(password|apiKey|token|secret)=\\S+"; private static final String MASK_REPLACEMENT = "$1=***MASKED***"; @Override public String convert(ILoggingEvent event) { String originalMessage = super.convert(event); // 对日志消息进行脱敏处理 return originalMessage.replaceAll(SENSITIVE_PATTERN, MASK_REPLACEMENT); } }
- 在Logback配置里注册转换器,创建
logback-spring.xml文件(放在resources目录下):
<configuration> <!-- 注册自定义的消息转换器,替换默认的message转换逻辑 --> <conversionRule conversionWord="message" converterClass="com.your.package.SensitiveDataMaskingConverter"/> <!-- 配置结构化日志的Appender --> <appender name="STRUCTURED_CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="org.springframework.boot.logging.logback.StructuredLogEncoder"> <formatter class="org.springframework.boot.logging.structured.JsonWriterStructuredLogFormatter"/> </encoder> </appender> <!-- 根日志配置 --> <root level="INFO"> <appender-ref ref="STRUCTURED_CONSOLE"/> </root> </configuration>
这样不管是结构化日志的message字段,还是普通文本日志的内容,都会被自动脱敏。
最后再提醒一句:正则表达式可以根据你的实际敏感字段调整,比如如果有JSON格式的内容,可能需要更复杂的正则(比如匹配"password":"[^"]+"这种格式)。如果你需要处理嵌套的JSON结构,可能还要结合JSON解析库(比如Jackson)来递归脱敏,不过大部分场景下简单的正则就够用了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

