在 Spring Boot 结合 MyBatis 的应用中,清空日志前缀(如 ==>
、<==
等)需要通过 自定义 MyBatis 的日志实现 或 修改日志模板 来实现。以下是两种常用方法:
方法 1:自定义 MyBatis 日志实现(推荐)
通过继承 MyBatis 的日志适配器,重写日志输出逻辑以移除前缀。
步骤:
创建自定义日志类
新建一个类,继承自org.apache.ibatis.logging.Log
并覆盖日志方法:java
复制
下载
import org.apache.ibatis.logging.Log; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class NoPrefixMyBatisLogger implements Log { private final Logger logger; public NoPrefixMyBatisLogger(String clazz) { this.logger = LoggerFactory.getLogger(clazz); } @Override public boolean isDebugEnabled() { return logger.isDebugEnabled(); } @Override public boolean isTraceEnabled() { return logger.isTraceEnabled(); } @Override public void error(String s, Throwable e) { logger.error(s, e); } @Override public void error(String s) { logger.error(s); } @Override public void debug(String s) { // 直接输出原始 SQL,移除前缀 "==> " logger.debug(s.replaceAll("^==>\\s+", "")); } @Override public void trace(String s) { // 直接输出结果,移除前缀 "<== " logger.trace(s.replaceAll("^<==\\s+", "")); } @Override public void warn(String s) { logger.warn(s); } }
创建日志工厂类
实现org.apache.ibatis.logging.LogFactory
:java
复制
下载
import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; public class NoPrefixLogFactory implements LogFactory { @Override public Log getLog(Class<?> clazz) { return new NoPrefixMyBatisLogger(clazz.getName()); } }
在
application.yml
中指定日志工厂
配置 MyBatis 使用自定义的日志工厂:yaml
复制
下载
mybatis: configuration: log-impl: com.yourpackage.NoPrefixLogFactory # 替换为你的包路径
方法 2:通过日志框架过滤前缀(以 Logback 为例)
修改日志配置文件,使用正则过滤掉前缀。
步骤:
修改
logback-spring.xml
文件
在日志模板中使用replace
函数移除前缀:xml
复制
下载
运行
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!-- 关键:使用 replace 过滤前缀 --> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- 针对 MyBatis 的 Logger 单独处理 --> <logger name="org.apache.ibatis" level="DEBUG"> <appender-ref ref="CONSOLE" /> </logger> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration>
使用正则替换日志内容
在pattern
中无法直接替换,需结合自定义Layout
(较复杂)。更简单的方式是直接修改方法 1 中的日志输出。
验证结果
配置后执行 SQL,日志将不再显示前缀:
plaintext
复制
下载
2023-10-01 12:00:00 DEBUG [main] mapper.UserMapper.selectUser - Preparing: SELECT * FROM user WHERE id = ? 2023-10-01 12:00:00 DEBUG [main] mapper.UserMapper.selectUser - Parameters: 1(Integer) 2023-10-01 12:00:00 DEBUG [main] mapper.UserMapper.selectUser - Total: 1
注意事项
MyBatis 原生前缀来源
前缀==>
和<==
是 MyBatis 在Log
实现中硬编码添加的(见BaseJdbcLogger
类),无法通过配置直接关闭,必须通过自定义日志实现覆盖。日志级别
确保 MyBatis 的日志级别为DEBUG
(在application.yml
中配置):yaml
复制
下载
logging: level: com.yourpackage.mapper: DEBUG # Mapper 接口所在包
性能影响
方法 1 中的正则替换s.replaceAll(...)
可能轻微影响性能,可在高并发场景下优化为字符串截取。
选择适合你项目的方式即可彻底移除日志前缀。