使用Mybatis的時(shí)候,有些時(shí)候能輸出(主要是指sql拯刁,參數(shù)脊岳,結(jié)果)日志。有些時(shí)候就不能垛玻。
無法輸出日志的時(shí)候割捅,無論怎么配置log4j,不管是properties的還是xml的帚桩,都不起作用亿驾。
有些時(shí)候,我們沒做什么配置就能輸出日志....
這是一個(gè)讓無數(shù)人煩躁的問題账嚎。其實(shí)解決問題很容易(我過了這么久才解決莫瞬,以前都用攔截器輸出)。
這是一個(gè)普大喜奔的日子郭蕉,讓我們一起來看看如何解決mybatis的日志問題疼邀。
為什么說這個(gè)問題很容易解決呢?因?yàn)閙ybatis的文檔寫的很清楚恳不。
為什么我們都沒找到解決辦法呢檩小?因?yàn)榧词箍催^文檔的人,也未必去看Logging這一節(jié)烟勋。但是這一節(jié)正是解決問題的關(guān)鍵规求。
已經(jīng)等不及的小伙伴們可以直接去這里看文檔:http://mybatis.github.io/mybatis-3/zh/logging.html
提醒最常用的方法不再這個(gè)鏈接中筐付,但是這個(gè)文檔提供了對log4j的詳細(xì)配置。本文下面的內(nèi)容大部分是這個(gè)文檔的Copy阻肿。
Mybatis內(nèi)置的日志工廠提供日志功能瓦戚,具體的日志實(shí)現(xiàn)有以下幾種方式:
SLF4J
Apache Commons Logging
Log4j 2
Log4j
JDK logging
具體選擇哪個(gè)日志實(shí)現(xiàn)由MyBatis的內(nèi)置日志工廠確定。它會使用最先找到的(按上文列舉的順序查找)丛塌。如果一個(gè)都未找到较解,日志功能就會被禁用。
不少應(yīng)用服務(wù)器的classpath中已經(jīng)包含Commons Logging赴邻,如Tomcat和WebShpere印衔,所以MyBatis會把它作為具體的日志實(shí)現(xiàn)。
記住這點(diǎn)非常重要姥敛。這意味著奸焙,在諸如WebSphere的環(huán)境中——WebSphere提供了Commons Logging的私有實(shí)現(xiàn),你的Log4J配置將被忽略彤敛。
這種做法不免讓人悲催与帆,MyBatis怎么能忽略你的配置呢?事實(shí)上墨榄,因Commons Logging已經(jīng)存在玄糟,按優(yōu)先級Log4J自然就被忽略了!
不過袄秩,如果你的應(yīng)用部署在一個(gè)包含Commons Logging的環(huán)境阵翎,而你又想用其他的日志框架,你可以根據(jù)需要調(diào)用如下的某一方法:
[java]view plaincopy
1.org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
2.org.apache.ibatis.logging.LogFactory.useLog4JLogging();
3.org.apache.ibatis.logging.LogFactory.useJdkLogging();
4.org.apache.ibatis.logging.LogFactory.useCommonsLogging();
5.org.apache.ibatis.logging.LogFactory.useStdOutLogging();
如果的確需要調(diào)用以上的某個(gè)方法播揪,請?jiān)谡{(diào)用所有其他MyBatis方法前調(diào)用它贮喧。另外,只有在相應(yīng)日志實(shí)現(xiàn)存在的前提下猪狈,調(diào)用對應(yīng)的方法才是有意義的箱沦,否則MyBatis一概忽略。如你環(huán)境中并不存在Log4J雇庙,你卻調(diào)用了相應(yīng)的方法谓形,MyBatis就會忽略這一調(diào)用,代之默認(rèn)的查找順序查找日志實(shí)現(xiàn)疆前。
例如使用log4j就需要在調(diào)用mybatis方法前寒跳,先執(zhí)行代碼:
[java]view plaincopy
1.org.apache.ibatis.logging.LogFactory.useLog4JLogging();
上面這是一種解決辦法,但是有些情況你不知道何時(shí)執(zhí)行這個(gè)方法竹椒。
mybatis還提供了另外一種(推薦使用這種)解決方法童太,繼續(xù)看下面。
另一種解決為,在mybatis-config.xml配置文件中:
[html]view plaincopy
1.
2.
3.name="logImpl"value="LOG4J"/>
4.
5.
這里只寫了關(guān)鍵的一部分配置信息书释,在你自己配置的基礎(chǔ)上增加即可翘贮。這樣一來log4j的配置信息就會起作用。
參數(shù)說明:
Mybatis對Log4j的配置支持:
Logging Configuration
MyBatis可以對包爆惧、類狸页、命名空間和全限定的語句記錄日志。
具體怎么做扯再,視使用的日志框架而定芍耘,這里以Log4J為例。配置日志功能非常簡單:添加幾個(gè)配置文件熄阻,如log4j.properties,再增加個(gè)jar包斋竞,如log4j.jar。下面是具體的例子饺律,共兩個(gè)步驟:
步驟1:增加Log4J jar包
因?yàn)椴捎肔og4J窃页,要確保在應(yīng)用中對應(yīng)的jar包是可用的。要滿足這一點(diǎn)复濒,只要將jar包添加到應(yīng)用的classpath中即可。Log4J的jar包可以從上方的鏈接下載乒省。
具體而言巧颈,對于web或企業(yè)應(yīng)用,需要將log4j.jar添加到WEB-INF/lib目錄袖扛;對于獨(dú)立應(yīng)用砸泛,可以將它添加到j(luò)vm的-classpath啟動(dòng)參數(shù)中。
步驟2:配置Log4J
配置Log4J比較簡單蛆封,比如需要記錄這個(gè)mapper接口的日志:
[java]view plaincopy
1.packageorg.mybatis.example;
2.publicinterfaceBlogMapper?{
3.@Select("SELECT?*?FROM?blog?WHERE?id?=?#{id}")
4.Blog?selectBlog(intid);
5.}
只要在應(yīng)用的classpath中創(chuàng)建一個(gè)名稱為log4j.properties的文件唇礁,文件的具體內(nèi)容如下:
[plain]view plaincopy
1.#?Global?logging?configuration
2.log4j.rootLogger=ERROR,?stdout
3.#?MyBatis?logging?configuration...
4.log4j.logger.org.mybatis.example.BlogMapper=TRACE
5.#?Console?output...
6.log4j.appender.stdout=org.apache.log4j.ConsoleAppender
7.log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
8.log4j.appender.stdout.layout.ConversionPattern=%5p?[%t]?-?%m%n
添加以上配置后,Log4J就會把org.mybatis.example.BlogMapper的詳細(xì)執(zhí)行日志記錄下來惨篱,對于應(yīng)用中的其它類則僅僅記錄錯(cuò)誤信息盏筐。
也可以將日志從整個(gè)mapper接口級別調(diào)整到到語句級別,從而實(shí)現(xiàn)更細(xì)粒度的控制砸讳。如下配置只記錄selectBlog語句的日志:
[plain]view plaincopy
1.log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
與此相對琢融,可以對一組mapper接口記錄日志,只要對mapper接口所在的包開啟日志功能即可:
[plain]view plaincopy
1.log4j.logger.org.mybatis.example=TRACE
某些查詢可能會返回大量的數(shù)據(jù)簿寂,只想記錄其執(zhí)行的SQL語句該怎么辦漾抬?為此,Mybatis中SQL語句的日志級別被設(shè)為DEBUG(JDK Logging中為FINE)常遂,結(jié)果日志的級別為TRACE(JDK Logging中為FINER)纳令。所以,只要將日志級別調(diào)整為DEBUG即可達(dá)到目的:
[plain]view plaincopy
1.log4j.logger.org.mybatis.example=DEBUG
要記錄日志的是類似下面的mapper文件而不是mapper接口又該怎么呢?
[html]view plaincopy
1.version="1.0"encoding="UTF-8"?>
2.
3.PUBLIC?"-//mybatis.org//DTD?Mapper?3.0//EN"
4."http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5.namespace="org.mybatis.example.BlogMapper">
6.id="selectBlog"resultType="Blog">
7.select?*?from?Blog?whereid=?#{id}
8.
9.
對這個(gè)文件記錄日志,只要對命名空間增加日志記錄功能即可:
[plain]view plaincopy
1.log4j.logger.org.mybatis.example.BlogMapper=TRACE
進(jìn)一步,要記錄具體語句的日志可以這樣做:
[plain]view plaincopy
1.log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
看到了把莺褒,兩種配置沒差別阻荒!
配置文件log4j.properties的余下內(nèi)容是針對日志格式的,這一內(nèi)容已經(jīng)超出本文檔范圍僚楞。關(guān)于Log4J的更多內(nèi)容,可以參考Log4J的網(wǎng)站。不過来累,可以簡單試一下看看,不同的配置會產(chǎn)生什么不一樣的效果窘奏。
??C"????'