MyBatis實(shí)戰(zhàn)指南之MyBatis日志詳解
前言
- 在上一篇博客中,我們深入剖析了 MyBatis 的緩存機(jī)制原理與實(shí)戰(zhàn)應(yīng)用。
- 作為 MyBatis 框架中另一重要的基礎(chǔ)設(shè)施,日志系統(tǒng)在項(xiàng)目開(kāi)發(fā)、調(diào)試及運(yùn)維階段承擔(dān)著關(guān)鍵作用 —— 它不僅能幫助開(kāi)發(fā)者追蹤 SQL 執(zhí)行流程、定位異常問(wèn)題,還能通過(guò)日志級(jí)別控制實(shí)現(xiàn)不同環(huán)境下的調(diào)試信息輸出管理。
- 從本文開(kāi)始,我們將圍繞 MyBatis 日志模塊展開(kāi)系統(tǒng)講解,涵蓋 日志框架集成(Log4j/SLF4J 等)、配置方式、源碼解析及性能優(yōu)化 等核心內(nèi)容,幫助讀者全面掌握 MyBatis 日志體系的技術(shù)細(xì)節(jié)與最佳實(shí)踐。
一、為什么需要日志?
舉個(gè)生活中的例子:你網(wǎng)購(gòu)收到商品發(fā)現(xiàn)有問(wèn)題,打電話給客服時(shí),客服需要查看訂單記錄(日志)才能定位問(wèn)題。MyBatis的日志也是一樣的道理:
- 開(kāi)發(fā)階段:打印SQL語(yǔ)句和參數(shù),幫你確認(rèn)寫(xiě)的SQL是否正確(比如有沒(méi)有拼錯(cuò)表名、where條件是否正確)
- 調(diào)試階段:記錄異常信息(比如數(shù)據(jù)庫(kù)連接失敗、參數(shù)類(lèi)型錯(cuò)誤),快速定位報(bào)錯(cuò)位置
- 生產(chǎn)階段:通過(guò)控制日志級(jí)別,只記錄重要信息(比如錯(cuò)誤日志),避免無(wú)關(guān)信息干擾
最常用的場(chǎng)景:當(dāng)你發(fā)現(xiàn)查詢(xún)結(jié)果不對(duì)時(shí),第一時(shí)間打開(kāi)日志看看實(shí)際執(zhí)行的SQL是什么,90%的問(wèn)題都能通過(guò)對(duì)比SQL找到原因!
二、日志框架怎么選?
MyBatis本身不自帶日志實(shí)現(xiàn),需要集成第三方日志框架。
- 常見(jiàn)的框架有這幾種。
| 框架名稱(chēng) | 優(yōu)點(diǎn) | 缺點(diǎn) | 適合場(chǎng)景 |
|---|---|---|---|
| SLF4J | 統(tǒng)一日志接口,支持多種實(shí)現(xiàn)(如Logback) | 不能單獨(dú)使用,必須搭配具體實(shí)現(xiàn) | 新項(xiàng)目首選,推薦搭配Logback |
| Log4j | 老牌框架,配置簡(jiǎn)單 | 性能一般,新版本Log4j2已發(fā)布 | 兼容舊項(xiàng)目 |
| Log4j2 | 性能更好,支持異步日志 | 配置比Log4j復(fù)雜一點(diǎn) | 對(duì)性能要求高的項(xiàng)目 |
| Java自帶JUL | 無(wú)需額外依賴(lài) | 功能簡(jiǎn)單,配置不夠靈活 | 極簡(jiǎn)項(xiàng)目或臨時(shí)調(diào)試 |
1. 手把手教你集成(以最常用的SLF4J+Logback為例)
步驟1:添加依賴(lài)(Maven項(xiàng)目)
<!-- SLF4J接口 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.7</version>
</dependency>
<!-- Logback實(shí)現(xiàn) -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.13</version>
</dependency>步驟2:在MyBatis配置文件中開(kāi)啟日志
在mybatis-config.xml中添加:
<settings>
<!-- 設(shè)置日志工廠為SLF4J -->
<setting name="logImpl" value="SLF4J"/>
</settings>步驟3:配置Logback日志文件
在src/main/resources目錄下新建logback.xml,核心配置如下(重點(diǎn)看注釋?zhuān)?/p>
<configuration>
<!-- 定義日志輸出格式 -->
<pattern name="simplePattern">%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern>
<!-- 控制臺(tái)輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${simplePattern}</pattern>
</encoder>
</appender>
<!-- 重點(diǎn):配置MyBatis日志輸出 -->
<logger name="org.apache.ibatis" level="DEBUG"/> <!-- 輸出MyBatis自身日志 -->
<logger name="com.yourcompany.mapper" level="DEBUG"/> <!-- 輸出你的Mapper接口日志 -->
<root level="INFO"> <!-- 全局日志級(jí)別,優(yōu)先級(jí)低于上面的logger -->
<appender-ref ref="CONSOLE"/>
</root>
</configuration>三、配置方式詳解
1. MyBatis自身的日志配置
在mybatis-config.xml中,通過(guò)<settings>標(biāo)簽配置:
logImpl:指定使用的日志框架(可選值:SLF4J、LOG4J、LOG4J2、JUL、STDOUT_LOGGING、NO_LOGGING)<!-- 示例:使用Log4j2 --> <setting name="logImpl" value="LOG4J2"/>
lazyLoadingEnabled和aggressiveLazyLoading:這兩個(gè)和延遲加載相關(guān)的日志,新手暫時(shí)不用管,保持默認(rèn)即可。
2. 日志級(jí)別控制
日志級(jí)別從低到高依次是:DEBUG < INFO < WARN < ERROR,級(jí)別越高,輸出的內(nèi)容越少。
- 開(kāi)發(fā)階段:建議設(shè)為
DEBUG,能看到完整的SQL語(yǔ)句和參數(shù)(比如:==> Preparing: SELECT * FROM user WHERE id=?) - 生產(chǎn)階段:設(shè)為
ERROR或WARN,只記錄錯(cuò)誤和警告,避免日志文件過(guò)大
3. Spring Boot中怎么配?
如果你用Spring Boot,不需要單獨(dú)寫(xiě)MyBatis配置文件,直接在application.properties中配置:
# 開(kāi)啟MyBatis日志 mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl # 配置具體Mapper的日志級(jí)別(比如只打印UserMapper的DEBUG日志) logging.level.com.yourcompany.mapper.UserMapper=DEBUG
四、源碼解析:搞懂MyBatis日志底層邏輯
如果你對(duì)底層原理好奇,可以簡(jiǎn)單了解這幾個(gè)核心類(lèi),不用記代碼,知道它們的關(guān)系就行:
1. 日志接口 Log
MyBatis定義了一個(gè)統(tǒng)一的日志接口Log,所有日志框架都要實(shí)現(xiàn)這個(gè)接口。比如Slf4jImpl就是SLF4J的實(shí)現(xiàn)類(lèi),Log4jImpl是Log4j的實(shí)現(xiàn)類(lèi)。
2. 日志工廠LogFactory
它就像一個(gè)"工廠",根據(jù)你配置的logImpl,生產(chǎn)對(duì)應(yīng)的日志對(duì)象。比如你配置了SLF4J,它就會(huì)創(chuàng)建Slf4jImpl對(duì)象。
3. 自動(dòng)檢測(cè)機(jī)制
如果你的項(xiàng)目中同時(shí)存在多個(gè)日志框架(比如同時(shí)有Log4j和SLF4J),MyBatis會(huì)按以下順序自動(dòng)選擇:
SLF4J → LOG4J2 → LOG4J → JUL → STDOUT(控制臺(tái)輸出)→ NO_LOGGING(無(wú)日志)
所以建議只保留一個(gè)日志框架,避免沖突。
以上就是這篇博客的全部?jī)?nèi)容,下一篇我們將繼續(xù)探索MyBatis的更多精彩內(nèi)容。
到此這篇關(guān)于MyBatis實(shí)戰(zhàn)指南之MyBatis日志詳解的文章就介紹到這了,更多相關(guān)MyBatis日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)ArrayList排序的方法詳解
Java中常見(jiàn)的ArrayList排序方法主要為三種:JDK8的stream、Comparator#compare()和Comparable#compareTo(),本文將詳解這三者的使用,需要的可以參考一下2022-05-05
Java?Web實(shí)現(xiàn)類(lèi)似Excel表格鎖定功能實(shí)戰(zhàn)教程
本文將詳細(xì)介紹通過(guò)創(chuàng)建特定div元素并利用CSS布局和JavaScript事件監(jiān)聽(tīng)來(lái)實(shí)現(xiàn)類(lèi)似Excel的鎖定行和列效果的方法,感興趣的朋友跟隨小編一起看看吧2025-06-06
SpringBoot集成easy-rules規(guī)則引擎流程詳解
這篇文章主要介紹了SpringBoot集成easy-rules規(guī)則引擎流程,合理的使用規(guī)則引擎可以極大的減少代碼復(fù)雜度,提升代碼可維護(hù)性。業(yè)界知名的開(kāi)源規(guī)則引擎有Drools,功能豐富,但也比較龐大2023-03-03
Mybatis-plus對(duì)單表操作的封裝實(shí)現(xiàn)
本文詳細(xì)介紹了MyBatis-Plus單表操作,包括自定義SQL、邏輯刪除、樂(lè)觀鎖、全局?jǐn)r截器和代碼生成器等,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
PowerJob的IdGenerateService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的IdGenerateService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Project?Reactor源碼解析publishOn使用示例
這篇文章主要為大家介紹了Project?Reactor源碼解析publishOn使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
以實(shí)例簡(jiǎn)介Java中線程池的工作特點(diǎn)
這篇文章主要介紹了以實(shí)例簡(jiǎn)介Java中線程池的工作特點(diǎn),線程池是Java實(shí)現(xiàn)多線程編程的基礎(chǔ),需要的朋友可以參考下2015-09-09

