
日志
Mybatis 的內置日志工廠提供日志功能,內置日志工廠將日志交給以下其中一種工具作代理:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j
- JDK logging
MyBatis 內置日志工廠基于運行時自省機制選擇合適的日志工具。它會使用第一個查找得到的工具(按上文列舉的順序查找)。如果一個都未找到,日志功能就會被禁用。
不少應用服務器(如 Tomcat 和 WebShpere)的類路徑中已經包含 Commons Logging,所以在這種配置環境下的 MyBatis 會把它作為日志工具,記住這點非常重要。這將意味著,在諸如 WebSphere 的環境中,它提供了 Commons Logging 的私有實現,你的 Log4J 配置將被忽略。MyBatis 將你的 Log4J 配置忽略掉是相當令人郁悶的(事實上,正是因為在這種配置環境下,MyBatis 才會選擇使用 Commons Logging 而不是 Log4J)。如果你的應用部署在一個類路徑已經包含 Commons Logging 的環境中,而你又想使用其它日志工具,你可以通過在 MyBatis 配置文件 mybatis-config.xml 里面添加一項 setting 來選擇別的日志工具。
... ...
logImpl 可選的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是實現了接口 org.apache.ibatis.logging.Log 的,且構造方法是以字符串為參數的類的完全限定名。(譯者注:可以參考org.apache.ibatis.logging.slf4j.Slf4jImpl.java的實現)
你也可以調用如下任一方法來使用日志工具:
org.apache.ibatis.logging.LogFactory.useSlf4jLogging();org.apache.ibatis.logging.LogFactory.useLog4JLogging();org.apache.ibatis.logging.LogFactory.useJdkLogging();org.apache.ibatis.logging.LogFactory.useCommonsLogging();org.apache.ibatis.logging.LogFactory.useStdOutLogging();
如果你決定要調用以上某個方法,請在調用其它 MyBatis 方法之前調用它。另外,僅當運行時類路徑中存在該日志工具時,調用與該日志工具對應的方法才會生效,否則 MyBatis 一概忽略。如你環境中并不存在 Log4J,你卻調用了相應的方法,MyBatis 就會忽略這一調用,轉而以默認的查找順序查找日志工具。
關于 SLF4J、Apache Commons Logging、Apache Log4J 和 JDK Logging 的 API 介紹不在本文檔介紹范圍內。不過,下面的例子可以作為一個快速入門。關于這些日志框架的更多信息,可以參考以下鏈接:
- Apache Commons Logging
- Apache Log4j
- JDK Logging API
日志配置
你可以對包、映射類的全限定名、命名空間或全限定語句名開啟日志功能來查看 MyBatis 的日志語句。
再次說明下,具體怎么做,由使用的日志工具決定,這里以 Log4J 為例。配置日志功能非常簡單:添加一個或多個配置文件(如 log4j.properties),有時需要添加 jar 包(如 log4j.jar)。下面的例子將使用 Log4J 來配置完整的日志服務,共兩個步驟:
步驟 1:添加 Log4J 的 jar 包
因為我們使用的是 Log4J,就要確保它的 jar 包在應用中是可用的。要啟用 Log4J,只要將 jar 包添加到應用的類路徑中即可。Log4J 的 jar 包可以在上面的鏈接中下載。
對于 web 應用或企業級應用,則需要將 log4j.jar 添加到 WEB-INF/lib 目錄下;對于獨立應用,可以將它添加到JVM 的 -classpath 啟動參數中。
步驟 2:配置 Log4J
配置 Log4J 比較簡單,假如你需要記錄這個映射器接口的日志:
package org.mybatis.example;public interface BlogMapper { @Select("SELECT * FROM blog WHERE id = #{id}") Blog selectBlog(int id);}
在應用的類路徑中創建一個名稱為 log4j.properties 的文件,文件的具體內容如下:
# Global logging configurationlog4j.rootLogger=ERROR, stdout# MyBatis logging configuration...log4j.logger.org.mybatis.example.BlogMapper=TRACE# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
添加以上配置后,Log4J 就會記錄 org.mybatis.example.BlogMapper 的詳細執行操作,且僅記錄應用中其它類的錯誤信息(若有)。
你也可以將日志的記錄方式從接口級別切換到語句級別,從而實現更細粒度的控制。如下配置只對 selectBlog 語句記錄日志:
log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
與此相對,可以對一組映射器接口記錄日志,只要對映射器接口所在的包開啟日志功能即可:
log4j.logger.org.mybatis.example=TRACE
某些查詢可能會返回龐大的結果集,此時只想記錄其執行的 SQL 語句而不想記錄結果該怎么辦?為此,Mybatis 中 SQL 語句的日志級別被設為DEBUG(JDK 日志設為 FINE),結果的日志級別為 TRACE(JDK 日志設為 FINER)。所以,只要將日志級別調整為 DEBUG 即可達到目的:
log4j.logger.org.mybatis.example=DEBUG
要記錄日志的是類似下面的映射器文件而不是映射器接口又該怎么做呢?
<?xml version="1.0" encoding="UTF-8" ?> select * from Blog where id = #{id}
如需對 XML 文件記錄日志,只要對命名空間增加日志記錄功能即可:
log4j.logger.org.mybatis.example.BlogMapper=TRACE
要記錄具體語句的日志可以這樣做:
log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
你應該注意到了,為映射器接口和 XML 文件添加日志功能的語句毫無差別。
注意 如果你使用的是 SLF4J 或 Log4j 2,MyBatis 將以 MYBATIS 這個值進行調用。
配置文件 log4j.properties 的余下內容是針對日志輸出源的,這一內容已經超出本文檔范圍。關于 Log4J 的更多內容,可以參考Log4J 的網站。不過,你也可以簡單地做做實驗,看看不同的配置會產生怎樣的效果。