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

 更新时间:2025年10月09日 09:25:07   作者:宣晨光  
文章介绍Springboot中MyBatis SQL日志因大字段输出导致日志膨胀及JVM内存问题,建议通过Logback或Log4j2自定义Converter/Filter实现参数截断或脱敏,或调整日志级别限制调试信息,本文给大家介绍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>

到此这篇关于Spring boot中 限制 Mybatis SQL日志的大字段输出的文章就介绍到这了,更多相关Spring boot限制Mybatis SQL日志输出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java list.remove( )方法注意事项

    Java list.remove( )方法注意事项

    这篇文章主要介绍了Java list.remove( )方法注意事项,非常简单易懂,需要的朋友可以参考下
    2018-08-08
  • java和c/c++ 数据类型长度的比较

    java和c/c++ 数据类型长度的比较

    本篇文章主要是对java和c/c++ 数据类型长度的进行了详细的比较。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • Spring Boot 的java -jar命令启动原理详解

    Spring Boot 的java -jar命令启动原理详解

    这篇文章主要介绍了Spring Boot 的java -jar命令启动原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • IDEA创建SpringBoot父子Module项目的实现

    IDEA创建SpringBoot父子Module项目的实现

    本文主要介绍了IDEA创建SpringBoot父子Module项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java实战之用Swing实现通讯录管理系统

    Java实战之用Swing实现通讯录管理系统

    今天给大家带来的是Java实战的相关知识,文章围绕着Swing实现通讯录管理系统展开,文中有非常详细的代码示例,需要的朋友可以参考下
    2021-06-06
  • Java并发之条件阻塞Condition的应用代码示例

    Java并发之条件阻塞Condition的应用代码示例

    这篇文章主要介绍了Java并发之条件阻塞Condition的应用代码示例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java C++刷题leetcode1106解析布尔表达式

    Java C++刷题leetcode1106解析布尔表达式

    这篇文章主要为大家介绍了Java C++刷题leetcode1106解析布尔表达式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • java短路逻辑运算符实例用法详解

    java短路逻辑运算符实例用法详解

    在本篇文章里小编给大家分享的是一篇关于java短路逻辑运算符实例用法内容,有需要的朋友们可以学习参考下。
    2021-04-04
  • java批量修改文件后缀名方法总结

    java批量修改文件后缀名方法总结

    在本篇文章里小编给大家分享了关于java批量修改文件后缀名方法和相关知识点,有需要的朋友们学习下。
    2019-03-03
  • Spring Boot 中实现 WebSocket 集群思路详解

    Spring Boot 中实现 WebSocket 集群思路详解

    本文介绍了如何在SpringBoot中实现WebSocket集群处理,解决了会话共享和消息同步问题,通过分布式存储(Redis)和消息队列(RedisPub/Sub)实现跨节点通信,感兴趣的朋友跟随小编一起看看吧
    2025-12-12

最新评论