MyBatis 3 日志

2022-04-11 14:50 更新

日志

Mybatis 通過使用內(nèi)置的日志工廠提供日志功能。內(nèi)置日志工廠將會(huì)把日志工作委托給下面的實(shí)現(xiàn)之一:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j (deprecated since 3.5.9)
  • JDK logging

MyBatis 內(nèi)置日志工廠基于運(yùn)行時(shí)自省機(jī)制選擇合適的日志工具。它會(huì)使用第一個(gè)查找得到的工具(按上文列舉的順序查找)。如果一個(gè)都未找到,日志功能就會(huì)被禁用。

不少應(yīng)用服務(wù)器(如 ?Tomcat ?和 ?WebShpere?)的類路徑中已經(jīng)包含 ?Commons Logging?,所以在這種配置環(huán)境下的 MyBatis 會(huì)把它作為日志工具,記住這點(diǎn)非常重要。這將意味著,在諸如 ?WebSphere ?的環(huán)境中,它提供了 ?Commons Logging? 的私有實(shí)現(xiàn),你的 Log4J 配置將被忽略。MyBatis 將你的 Log4J 配置忽略掉是相當(dāng)令人郁悶的(事實(shí)上,正是因?yàn)樵谶@種配置環(huán)境下,MyBatis 才會(huì)選擇使用 ?Commons Logging? 而不是 Log4J)。如果你的應(yīng)用部署在一個(gè)類路徑已經(jīng)包含 ?Commons Logging? 的環(huán)境中,而你又想使用其它日志工具,你可以通過在 MyBatis 配置文件 mybatis-config.xml 里面添加一項(xiàng) setting 來選擇別的日志工具。

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

logImpl 可選的值有:?SLF4J?、?LOG4J?、?LOG4J2?、?JDK_LOGGING?、?COMMONS_LOGGING?、?STDOUT_LOGGING?、?NO_LOGGING?,或者是實(shí)現(xiàn)了接口 ?org.apache.ibatis.logging.Log? 的,且構(gòu)造方法是以字符串為參數(shù)的類的完全限定名。

你也可以調(diào)用如下任一方法來使用日志工具:

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

如果你決定要調(diào)用以上某個(gè)方法,請(qǐng)?jiān)谡{(diào)用其它 MyBatis 方法之前調(diào)用它。另外,僅當(dāng)運(yùn)行時(shí)類路徑中存在該日志工具時(shí),調(diào)用與該日志工具對(duì)應(yīng)的方法才會(huì)生效,否則 MyBatis 一概忽略。如你環(huán)境中并不存在 Log4J2,你卻調(diào)用了相應(yīng)的方法,MyBatis 就會(huì)忽略這一調(diào)用,轉(zhuǎn)而以默認(rèn)的查找順序查找日志工具。

日志配置

你可以對(duì)包、映射類的全限定名、命名空間或全限定語句名開啟日志功能來查看 MyBatis 的日志語句。

再次說明下,具體怎么做,由使用的日志工具決定,這里以 SLF4J(Logback) 為例。配置日志功能非常簡(jiǎn)單:添加一個(gè)或多個(gè)配置文件(如 logback.xml),有時(shí)需要添加 jar 包。下面的例子將使用 SLF4J(Logback) 來配置完整的日志服務(wù),共兩個(gè)步驟:

步驟 1:添加 SLF4J + Logback 的 jar 包

因?yàn)槲覀兪褂玫氖?nbsp;SLF4J(Logback),就要確保它的 jar 包在應(yīng)用中是可用的。要啟用 SLF4J(Logback),只要將 jar 包添加到應(yīng)用的類路徑中即可。SLF4J(Logback) 的 jar 包可以在上面的鏈接中下載。

對(duì)于 web 應(yīng)用或企業(yè)級(jí)應(yīng)用,則需要將 logback-classic.jar, logback-core.jar and slf4j-api.jar 添加到 WEB-INF/lib 目錄下;對(duì)于獨(dú)立應(yīng)用,可以將它添加到JVM 的 -classpath 啟動(dòng)參數(shù)中。

如果您使用 maven,您可以通過在 pom.xml 中添加以下設(shè)置來下載 jar 文件。

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.x.x</version>
</dependency>

步驟 2:配置 Logback

配置 Logback 比較簡(jiǎn)單,假如你需要記錄這個(gè)映射器接口的日志:

package org.mybatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

在應(yīng)用的類路徑中創(chuàng)建一個(gè)名稱為 ?logback.xml? 的文件,文件的具體內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>

  <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%5level [%thread] - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="org.mybatis.example.BlogMapper">
    <level value="trace"/>
  </logger>
  <root level="error">
    <appender-ref ref="stdout"/>
  </root>

</configuration>

添加以上配置后,SLF4J(Logback) 就會(huì)記錄 ?org.mybatis.example.BlogMapper? 的詳細(xì)執(zhí)行操作,且僅記錄應(yīng)用中其它類的錯(cuò)誤信息(若有)。

你也可以將日志的記錄方式從接口級(jí)別切換到語句級(jí)別,從而實(shí)現(xiàn)更細(xì)粒度的控制。如下配置只對(duì) ?selectBlog ?語句記錄日志:

<logger name="org.mybatis.example.BlogMapper.selectBlog">
  <level value="trace"/>
</logger>

與此相對(duì),可以對(duì)一組映射器接口記錄日志,只要對(duì)映射器接口所在的包開啟日志功能即可:

<logger name="org.mybatis.example">
  <level value="trace"/>
</logger>

某些查詢可能會(huì)返回龐大的結(jié)果集,此時(shí)只想記錄其執(zhí)行的 SQL 語句而不想記錄結(jié)果該怎么辦?為此,Mybatis 中 SQL 語句的日志級(jí)別被設(shè)為DEBUG(JDK 日志設(shè)為 FINE),結(jié)果的日志級(jí)別為 TRACE(JDK 日志設(shè)為 FINER)。所以,只要將日志級(jí)別調(diào)整為 DEBUG 即可達(dá)到目的:

<logger name="org.mybatis.example">
  <level value="debug"/>
</logger>

要記錄日志的是類似下面的映射器文件而不是映射器接口又該怎么做呢?

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

如需對(duì) XML 文件記錄日志,只要對(duì)命名空間增加日志記錄功能即可:

<logger name="org.mybatis.example.BlogMapper">
  <level value="trace"/>
</logger>

要記錄具體語句的日志可以這樣做:

<logger name="org.mybatis.example.BlogMapper.selectBlog">
  <level value="trace"/>
</logger>

你應(yīng)該注意到了,為映射器接口和 XML 文件添加日志功能的語句毫無差別。

如果你使用的是 SLF4J 或 Log4j 2,MyBatis 將以 MYBATIS 這個(gè)值進(jìn)行調(diào)用。

Log4j 2 的配置示例

  • ?pom.xml?

<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.x.x</version>
</dependency>

  • ?log4j2.xml?

<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config">

  <Appenders>
    <Console name="stdout" target="SYSTEM_OUT">
      <PatternLayout pattern="%5level [%t] - %msg%n"/>
    </Console>
  </Appenders>

  <Loggers>
    <Logger name="org.mybatis.example.BlogMapper" level="trace"/>
    <Root level="error" >
      <AppenderRef ref="stdout"/>
    </Root>
  </Loggers>

</Configuration>

Log4j 的配置示例

  • ?pom.xml?

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

  • ?log4j.properties?

log4j.rootLogger=ERROR, stdout

log4j.logger.org.mybatis.example.BlogMapper=TRACE

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

JDK 日志記錄的配置示例

  • ?logging.properties?

handlers=java.util.logging.ConsoleHandler
.level=SEVERE

org.mybatis.example.BlogMapper=FINER

java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tT.%1$tL %4$s %3$s - %5$s%6$s%n


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)