You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.4中如何对结构化日志中的敏感信息(如密码、API密钥等)进行脱敏?

Spring Boot 3.4中如何对结构化日志中的敏感信息(如密码、API密钥等)进行脱敏?

我之前也碰到过和你一模一样的问题!Spring Boot 3.4的结构化日志里,message字段确实有点特殊——你用StructuredLoggingJsonMembersCustomizer改不动它太正常了,因为这个Customizer本来就是用来添加、移除或修改额外的JSON成员的,而message属于日志的核心内容,有单独的处理流程,根本轮不到它来修改。

下面给你两个亲测有效的解决方案,按需选就行:


方法一:自定义结构化日志Formatter,直接改写message逻辑

这个方法专门针对结构化日志生效,不用改动Logback的核心配置,很适合只想处理结构化日志的场景:

  1. 创建自定义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);
    }
}
  1. 配置使用自定义Formatter,在application.yml或者application.properties里指定:
spring:
  logging:
    structured:
      formatter: com.your.package.MaskingJsonLogFormatter  # 换成你的类全路径

这样Spring Boot就会用你自定义的Formatter来生成结构化日志,message里的敏感内容会被自动替换成***MASKED***。


方法二:用Logback的消息转换器,全局脱敏所有日志

如果你希望不管是结构化日志还是普通文本日志,都能统一脱敏敏感内容,那用Logback的MessageConverter更合适:

  1. 创建自定义消息转换器:
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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:49:30