Spring boot中 限制 Mybatis SQL日志的大字段输出

由于现有的项目框架中,针对MyBatis的SQL日志,会完整的输出sql语句及参数内容。

存在对longtext、clob等大字段,在执行INSERT、UPDATA语句中,导致控制台输出问题:

  • 日志文件迅速膨胀
  • JVM内存异常

通过 LogbackLog4j2 的自定义 ConverterFilter,对 MyBatis 打印的 PreparedStatement 参数进行截断或脱敏。

可以直接通修改定日志级别,限制Debug级别

1、创建自定义转换器

复制代码
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;

/***
 *
 * @author xuancg
 * @date 2025/9/30
 */
public class SqlParamMaskingConverter extends ClassicConverter {
    private static final int MAX_LENGTH = 400;
    private static final String MASK = "...[MASKED: too long to show]";

    @Override
    public String convert(ILoggingEvent event) {
        String message = event.getFormattedMessage();

        // 匹配 PreparedStatement 的参数设置日志,如:? column1 = 'value'
        if (message.startsWith("==> Parameters:") || message.startsWith("Parameters:")) {
            return maskLongStrings(message);
        }
        return message;
    }

    private String maskLongStrings(String msg) {
        // 简单处理:对单引号包裹的长字符串进行截断
        if(msg.length() > MAX_LENGTH){
            return msg.substring(0, MAX_LENGTH) + MASK;
        }
        return msg;
    }
}

2、注册到 logback.xml

主要修改内容:

复制代码
<conversionRule conversionWord="maskedMsg" converterClass="com.xx.SqlParamMaskingConverter"/>

<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %maskedMsg%n" />
复制代码
<configuration>
    <!-- 注册自定义转换器 -->
    <conversionRule conversionWord="maskedMsg" converterClass="com.xx.SqlParamMaskingConverter"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %maskedMsg%n</pattern>
        </encoder>
    </appender>

    <!-- 只对 MyBatis 的 SQL 日志启用 -->
    <logger name="org.apache.ibatis.logging.jdbc.PreparedStatementLogger" level="DEBUG">
        <appender-ref ref="STDOUT"/>
    </logger>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
相关推荐
计算机毕设指导64 小时前
基于微信小程序的丽江市旅游分享系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·旅游
毕设源码-钟学长5 小时前
【开题答辩全过程】以 基于Spring Boot的社区养老服务管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
Coder_Boy_5 小时前
基于SpringAI的在线考试系统-企业级软件研发工程应用规范案例
java·运维·spring boot·软件工程·devops
indexsunny5 小时前
互联网大厂Java面试实战:微服务、Spring Boot与Kafka在电商场景中的应用
java·spring boot·微服务·面试·kafka·电商
SUDO-15 小时前
Spring Boot + Vue 2 的企业级 SaaS 多租户招聘管理系统
java·spring boot·求职招聘·sass
sheji34165 小时前
【开题答辩全过程】以 基于spring boot的停车管理系统为例,包含答辩的问题和答案
java·spring boot·后端
lifejump5 小时前
Pikachu | SQL-inject
数据库·sql
中年程序员一枚6 小时前
多数据源的springboot进行动态连接方案
java·spring boot·后端
w***76556 小时前
SpringBoot集成MQTT客户端
java·spring boot·后端
悟空码字7 小时前
三步搞定短信验证码!SpringBoot集成阿里云短信实战
java·spring boot·后端