由于现有的项目框架中,针对MyBatis的SQL日志,会完整的输出sql语句及参数内容。
存在对longtext、clob等大字段,在执行INSERT、UPDATA语句中,导致控制台输出问题:
- 日志文件迅速膨胀
- JVM内存异常

通过 Logback 或 Log4j2 的自定义 Converter
或 Filter
,对 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>