【原】配置Log4j,使得MyBatis打印出SQL語句

官網日誌:mybatis官網日誌文檔

日誌格式請參考:Pattern Layout 下對應的:Patterns規則。html

【配置步驟】

1、mybatis-config.xml

設置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();

 

2、配置log4j的配置文件。

不一樣的項目中,log4j的配置文件的格式可能不一樣,在一些項目中,log4j的配置文件是XML格式的,好比log4j.xml;在另外一些項目中,log4j的配置文件是properties格式的,好比log4j.properties。mybatis

一、對於properties格式文件的配置。

###############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便可達到目的:架構

二、對於xml格式文件的配置。

<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語句的配置完成。

三、XML格式配置的精簡版本

<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>

3、POM.XML文件配置

<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,其餘的無關緊要

 

 mybatis和其餘架構包混用,

最頭痛的就是這種,試了不少種辦法,最後才校驗出一種合適的辦法。就是必定要用log4j.xml配置

相關文章
相關標籤/搜索