在 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);}@Overridepublic boolean isDebugEnabled() {return logger.isDebugEnabled();}@Overridepublic boolean isTraceEnabled() {return logger.isTraceEnabled();}@Overridepublic void error(String s, Throwable e) {logger.error(s, e);}@Overridepublic void error(String s) {logger.error(s);}@Overridepublic void debug(String s) {// 直接輸出原始 SQL,移除前綴 "==> "logger.debug(s.replaceAll("^==>\\s+", ""));}@Overridepublic void trace(String s) {// 直接輸出結果,移除前綴 "<== "logger.trace(s.replaceAll("^<==\\s+", ""));}@Overridepublic 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 {@Overridepublic 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(...)
?可能輕微影響性能,可在高并發場景下優化為字符串截取。
選擇適合你項目的方式即可徹底移除日志前綴。