日誌格式請參考:Pattern Layout 下對應的:Patterns規則。html
設置MyBatis的Setting(非必須,不一樣環境下,可能不須要該設置)。緣由以下:java
Mybatis經過日誌工廠提供日誌信息,Mybatis內置的日誌模版是log4j,commons.log,jdk log也能夠經過slf4j簡單日誌模版結合log4j使用日誌信息輸出.具體選擇哪一個日誌實現由MyBatis的內置日誌工廠肯定。它會使用最早找到的(按上文列舉的順序查找)。 若是一個都未找到,日誌功能就會被禁用。很多應用服務器的classpath中已經包含Commons Logging,如Tomcat和WebShpere, 因此MyBatis會把它做爲具體的日誌實現。記住這點很是重要。這意味着,在諸如 WebSphere的環境中——WebSphere提供了Commons Logging的私有實現,你的Log4J配置將被忽略。spring
不過,若是你的應用部署在一個包含Commons Logging的環境, 而你又想用其餘的日誌框架,你能夠作以下配置.sql
1. 配置日誌輸出方式是log4j apache
在「src/main/java/resources」目錄下,建立mybatis-config.xml文件,而且輸入下列內容。api
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="lazyLoadingEnabled" value="false" /> <setting name="logImpl" value="LOG4J" /> </settings> </configuration>
2. 使用對應的方法來指定使用哪一個日誌實現框架服務器
org.apache.ibatis.logging.LogFactory.useSlf4jLogging(); org.apache.ibatis.logging.LogFactory.useLog4JLogging(); org.apache.ibatis.logging.LogFactory.useLog4J2Logging(); org.apache.ibatis.logging.LogFactory.useJdkLogging(); org.apache.ibatis.logging.LogFactory.useCommonsLogging(); org.apache.ibatis.logging.LogFactory.useStdOutLogging();
不一樣的項目中,log4j的配置文件的格式可能不一樣,在一些項目中,log4j的配置文件是XML格式的,好比log4j.xml;在另外一些項目中,log4j的配置文件是properties格式的,好比log4j.properties。mybatis
###############Log4j 4 SQL Output start################# ##下面兩個,選擇一個就能夠了 log4j.logger.com.xxx.mydao=DEBUG //這個本身的包名。若是沒有的話,可能不能打印出日誌 log4j.logger.com.xxx.mydao=TRACE log4j.logger.com.xxx.mydao.selectBlog=TRACE/DEBUG //這個是指定到方法級別 log4j.logger.com.springframework=DEBUG log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl=DEBUG log4j.logger.java.sql=DEBUG,CONSOLE ###############Log4j 4 SQL Output end###################//這裏就表示將對應的mapper結果記錄
某些查詢可能會返回大量的數據,只想記錄其執行的SQL語句該怎麼辦?爲此,Mybatis中SQL語 句的日誌級別被設爲DEBUG(JDK Logging中爲FINE),結果日誌的級別爲TRACE(JDK Logging中爲FINER)。因此,只要將日誌級別調整爲DEBUG便可達到目的:架構
<loggers> <!-- name能夠指定包名或具體的類;additivity若是指定true,則root logger也會生效,相同日誌會輸出兩次;false,則只有當前日誌文件輸出 --> <!-- 借據插入接口日誌 --> <logger level="info" name="insertCreditBill" additivity="false"> <appender-ref ref="insertCreditBillLog" /> </logger> <!-- 下面是打印經過log4j2打印出mybatis語句的配置--> <logger name="com.xxx.mydao"> <level>DEBUG</level> </logger> <logger name="com.springframework"> <level>DEBUG</level> </logger> <logger name="com.ibatis" additivity="true"> <level>DEBUG</level> </logger> <logger name="com.ibatis.common.jdbc.SimpleDataSource" additivity="true"> <level>DEBUG</level> </logger> <logger name="com.ibatis.common.jdbc.ScriptRunner" additivity="true"> <level>DEBUG</level> </logger> <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" additivity="true"> <level>DEBUG</level> </logger> <logger name="Java.sql.Connection" additivity="true"> <level>DEBUG</level> </logger> <logger name="java.sql.Statement" additivity="true"> <level>DEBUG</level> </logger> <logger name="java.sql.PreparedStatement" additivity="true"> <level>DEBUG</level> </logger> <logger name="java.sql.ResultSet" additivity="true"> <level>DEBUG</level> </logger> <logger name="org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl" additivity="true"> <level>DEBUG</level> </logger> <!-- root logger,任何其它的logger最終都至關於繼承自 root logger --> <root level="INFO"> <appenderRef ref="Console" /> <appenderRef ref="FileLog"></appenderRef> </root> </loggers>
說明:app
上述配置中,「com.xxx.mydao」爲本身項目中MyBatis的全部的mapper和xml文件所在的包名字。
至此,log4j的打印SQL語句的配置完成。
<loggers> <!-- 下面是打印經過log4j2打印出mybatis語句的配置--> <logger name="com.xxx.mydao"> <level>DEBUG</level> </logger> <!-- root logger,任何其它的logger最終都至關於繼承自 root logger --> <root level="INFO"> <appenderRef ref="Console" /> <appenderRef ref="FileLog"></appenderRef> </root> </loggers>
說明:
在開發中,須要配置讓哪一個包下的程序打印出SQL,則僅僅只用配置那一個包名就成。
上述配置中,「com.xxx.mydao」爲本身項目中MyBatis的mapper和xml文件所在的包名字,所以,精簡版中,僅僅配置了這個包的內容
【拓展】
「細粒度」控制:Log4j打印出MyBatis中僅僅單個Mapper的配置。
<!-- 下面是經過配置log4j2,僅僅打印出單個mapper的SQL語句的配置--> <logger name="com.**.dao.UserMapper"> <level>DEBUG</level> </logger>
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> 一、單獨開放第三個沒法打印sql語句 二、第一種和第三種沒法打印sql語句 三、其餘狀況均可以打印出sql語句 四、最後得出的結論多是版本衝突的問題 總而言之 一、沒有slf4j,只要log4j便可 二、有slf4j,則必需要有slf4j-log4j12,其餘的無關緊要
最頭痛的就是這種,試了不少種辦法,最後才校驗出一種合適的辦法。就是必定要用log4j.xml配置