調試mybatis源碼時,想要更改日志的的實現工具,首先需要了解其原理。
源碼包里有這部分的解釋,翻譯如下:
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 來選擇別的日志工具。
<configuration> <settings> ... <setting name="logImpl" value="LOG4J"/> ... </settings> </configuration>
logImpl 可選的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是實現了接口 org.apache.ibatis.logging.Log 的,且構造方法是以字符串為參數的類的完全限定名。
需要注意的是:僅當運行時類路徑中存在該日志工具時,調用與該日志工具對應的方法才會生效,否則 MyBatis 一概忽略。如你環境中並不存在 Log4J,你卻調用了相應的方法,MyBatis 就會忽略這一調用,轉而以默認的查找順序查找日志工具。