1. 程式人生 > >Mybatis logj日誌配置問題 以及日誌相關的所有問題

Mybatis logj日誌配置問題 以及日誌相關的所有問題

使用Mybatis的時候,有些時候能輸出(主要是指sql,引數,結果)日誌。有些時候就不能。

無法輸出日誌的時候,無論怎麼配置log4j,不管是properties的還是xml的,都不起作用。

有些時候,我們沒做什麼配置就能輸出日誌....

這是一個讓無數人煩躁的問題。其實解決問題很容易(我過了這麼久才解決,以前都用攔截器輸出)。

這是一個普大喜奔的日子,讓我們一起來看看如何解決mybatis的日誌問題。

為什麼說這個問題很容易解決呢?因為mybatis的文件寫的很清楚。

為什麼我們都沒找到解決辦法呢?因為即使看過文件的人,也未必去看Logging這一節。但是這一節正是解決問題的關鍵。

已經等不及的小夥伴們可以直接去這裡看文件:http://mybatis.github.io/mybatis-3/zh/logging.html

提醒最常用的方法不再這個連結中,但是這個文件提供了對log4j的詳細配置。本文下面的內容大部分是這個文件的Copy。

Mybatis內建的日誌工廠提供日誌功能,具體的日誌實現有以下幾種方式:

SLF4J
Apache Commons Logging
Log4j 2
Log4j
JDK logging
具體選擇哪個日誌實現由MyBatis的內建日誌工廠確定。它會使用最先找到的(按上文列舉的順序查詢)。 如果一個都未找到,日誌功能就會被禁用。

不少應用伺服器的classpath中已經包含Commons Logging,如Tomcat和WebShpere, 所以MyBatis會把它作為具體的日誌實現。

記住這點非常重要。這意味著,在諸如 WebSphere的環境中——WebSphere提供了Commons Logging的私有實現,你的Log4J配置將被忽略。

 這種做法不免讓人悲摧,MyBatis怎麼能忽略你的配置呢?事實上,因Commons Logging已經存 在,按優先順序Log4J自然就被忽略了!

不過,如果你的應用部署在一個包含Commons Logging的環境, 而你又想用其他的日誌框架,你可以根據需要呼叫如下的某一方法:


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就會忽略這一呼叫,代之預設的查詢順序查詢日誌實現。

例如使用log4j就需要在呼叫mybatis方法前,先執行程式碼:

org.apache.ibatis.logging.LogFactory.useLog4JLogging();

上面這是一種解決辦法,但是有些情況你不知道何時執行這個方法。

mybatis還提供了另外一種(推薦使用這種)解決方法,繼續看下面。

另一種解決為,在mybatis-config.xml配置檔案中:

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

這裡只寫了關鍵的一部分配置資訊,在你自己配置的基礎上增加<setting name="logImpl" value="LOG4J"/>即可。這樣一來log4j的配置資訊就會起作用。