MyBatis學習總結(五)---MyBatis中日誌的使用及使用log4j示例

  

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 的,且構造方法是以字符串爲參數的類的完全限定名。(譯者注:可以參考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 就會忽略這一調用,轉而以默認的查找順序查找日誌工具。

    輸出日誌方法一:使用標準的日誌輸出

   這種方法只需要在MyBatis的配置文件中加入一個設置即可,而不需要導入log4j包,也不需要對log4j進行配置

    

  <settings>
		<setting name="logImpl" value="STDOUT_LOGGING" />
	</settings>
<?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>

	<!-- 引用並使用db.properties -->
	<properties resource="db.properties" />
	
	<settings>
		<setting name="logImpl" value="STDOUT_LOGGING" />
	</settings>
	
	<!-- environments:信息配置的是連接數據庫的(數據源的)一些參數,如用戶名,密碼等,MyBatis數據庫操作的session就是根據這些信息初始化的 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<!-- 數據源配置 -->
			<dataSource type="POOLED">
				<!-- 數據庫驅動 -->
				<property name="driver" value="${driver}" />
				<!-- 數據庫連接URL -->
				<property name="url" value="${url}" />
				<!-- 數據庫用戶名和密碼 -->
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>



	<!-- mappers:配置的是一個個Mapper文件,這些文件來約束數據庫的信息(Relationship) 和 對象(Object)的信息映射(Mapper);它負責完成對象和數據庫表的映射,是ORM最具體的配置 -->
	<mappers>
		<!-- 配置實體映射文件 -->
		<mapper resource="com/mybatisstudy/dao/userMapper.xml" />
	</mappers>


</configuration>

   使用這種方式控制檯的輸出示例:

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 76432244.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@48e4374]
==>  Preparing: INSERT INTO user(id,name,sex,age) VALUES(?,?,?,?); 
==> Parameters: 1003(Integer), 小杰(String), 男(String), 20(Integer)
<==    Updates: 1
==>  Preparing: UPDATE user SET age=? ,name=? WHERE id=? 
==> Parameters: 21(Integer), 小明(String), 1003(Integer)
<==    Updates: 1
==>  Preparing: SELECT * FROM user where id = ? ; 
==> Parameters: 1001(Integer)
<==    Columns: id, name, sex, age
<==        Row: 1001, 小明, 男, 21
<==      Total: 1
[id:1001,name:小明,sex:男,age:21]
==>  Preparing: DELETE FROM user WHERE id=?; 
==> Parameters: 1003(Integer)
<==    Updates: 1
==>  Preparing: SELECT * FROM user ; 
==> Parameters: 
<==    Columns: id, name, sex, age
<==        Row: 1001, 小明, 男, 21
<==        Row: 1002, 小華, 男, 18
<==      Total: 2
[[id:1001,name:小明,sex:男,age:21], [id:1002,name:小華,sex:男,age:18]]
Rolling back JDBC Connection [com.mysql.jdbc.JDBC4Connection@48e4374]
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@48e4374]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@48e4374]
Returned connection 76432244 to pool.

        輸出日誌方法二:使用log4j日誌輸出

       1.導入log4j包,如:log4j-1.2.17.jar

       2.在MyBatis的配置文件中配置:

      

<settings>
		<setting name="logImpl" value="LOG4J" />
	</settings>

      3.根據自己的需要配置log4j配置文件中的內容(如配置輸出端(Appenders)和日誌格式化器(Layout)等)

     示例(輸出到控制檯和文件中):

      

log4j.rootLogger=DEBUG,CONSOLE,FILE
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE,LF5_APPENDER

log4j.addivity.org.apache=true
 

# Console Appender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n


# File Appender
log4j.appender.FILE=org.apache.log4j.FileAppender
#此處是用絕對路徑
#也可以用相對路徑,如在一個listener中獲取項目運行的真正路徑apppath,然後如:${apppath}/MyBatis.log
log4j.appender.FILE.File=D:/MyBatis.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
# Use this layout for LogFactor 5 analysis






     控制檯的輸出結果:

     

2018-11-23 11:10:09,634 [main] DEBUG [org.apache.ibatis.logging.LogFactory] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
2018-11-23 11:10:09,755 [main] DEBUG [org.apache.ibatis.logging.LogFactory] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
2018-11-23 11:10:09,780 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - PooledDataSource forcefully closed/removed all connections.
2018-11-23 11:10:09,780 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - PooledDataSource forcefully closed/removed all connections.
2018-11-23 11:10:09,781 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - PooledDataSource forcefully closed/removed all connections.
2018-11-23 11:10:09,781 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - PooledDataSource forcefully closed/removed all connections.
2018-11-23 11:10:09,950 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Opening JDBC Connection
2018-11-23 11:10:10,383 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - Created connection 835227336.
2018-11-23 11:10:10,384 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@31c88ec8]
2018-11-23 11:10:10,390 [main] DEBUG [com.mybatisstudy.dao.IUserDao.addUser] - ==>  Preparing: INSERT INTO user(id,name,sex,age) VALUES(?,?,?,?); 
2018-11-23 11:10:10,479 [main] DEBUG [com.mybatisstudy.dao.IUserDao.addUser] - ==> Parameters: 1003(Integer), 小杰(String), 男(String), 20(Integer)
2018-11-23 11:10:10,520 [main] DEBUG [com.mybatisstudy.dao.IUserDao.addUser] - <==    Updates: 1
2018-11-23 11:10:10,531 [main] DEBUG [com.mybatisstudy.dao.IUserDao.updateUser] - ==>  Preparing: UPDATE user SET age=? ,name=? WHERE id=? 
2018-11-23 11:10:10,532 [main] DEBUG [com.mybatisstudy.dao.IUserDao.updateUser] - ==> Parameters: 21(Integer), 小明(String), 1003(Integer)
2018-11-23 11:10:10,538 [main] DEBUG [com.mybatisstudy.dao.IUserDao.updateUser] - <==    Updates: 1
2018-11-23 11:10:10,544 [main] DEBUG [com.mybatisstudy.dao.IUserDao.selectUserById] - ==>  Preparing: SELECT * FROM user where id = ? ; 
2018-11-23 11:10:10,545 [main] DEBUG [com.mybatisstudy.dao.IUserDao.selectUserById] - ==> Parameters: 1001(Integer)
2018-11-23 11:10:10,576 [main] DEBUG [com.mybatisstudy.dao.IUserDao.selectUserById] - <==      Total: 1
[id:1001,name:小明,sex:男,age:21]
2018-11-23 11:10:10,579 [main] DEBUG [com.mybatisstudy.dao.IUserDao.deleteUserById] - ==>  Preparing: DELETE FROM user WHERE id=?; 
2018-11-23 11:10:10,580 [main] DEBUG [com.mybatisstudy.dao.IUserDao.deleteUserById] - ==> Parameters: 1003(Integer)
2018-11-23 11:10:10,581 [main] DEBUG [com.mybatisstudy.dao.IUserDao.deleteUserById] - <==    Updates: 1
2018-11-23 11:10:10,583 [main] DEBUG [com.mybatisstudy.dao.IUserDao.selectAllUser] - ==>  Preparing: SELECT * FROM user ; 
2018-11-23 11:10:10,584 [main] DEBUG [com.mybatisstudy.dao.IUserDao.selectAllUser] - ==> Parameters: 
2018-11-23 11:10:10,585 [main] DEBUG [com.mybatisstudy.dao.IUserDao.selectAllUser] - <==      Total: 2
[[id:1001,name:小明,sex:男,age:21], [id:1002,name:小華,sex:男,age:18]]
2018-11-23 11:10:10,587 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Rolling back JDBC Connection [com.mysql.jdbc.JDBC4Connection@31c88ec8]
2018-11-23 11:10:10,828 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@31c88ec8]
2018-11-23 11:10:10,828 [main] DEBUG [org.apache.ibatis.transaction.jdbc.JdbcTransaction] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@31c88ec8]
2018-11-23 11:10:10,829 [main] DEBUG [org.apache.ibatis.datasource.pooled.PooledDataSource] - Returned connection 835227336 to pool.

      日誌文件中的內容:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章