• SLF4J
    • Apache Commons Logging
    • Log4j 2
    • Log4j (deprecated since 3.5.9)
    • 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 来选择别的日志工具。

    logImpl 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了接口 的,且构造方法是以字符串为参数的类的完全限定名。(译者注:可以参考org.apache.ibatis.logging.slf4j.Slf4jImpl.java的实现)

    你也可以调用如下任一方法来使用日志工具:

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

    如果你决定要调用以上某个方法,请在调用其它 MyBatis 方法之前调用它。另外,仅当运行时类路径中存在该日志工具时,调用与该日志工具对应的方法才会生效,否则 MyBatis 一概忽略。如你环境中并不存在 Log4J2,你却调用了相应的方法,MyBatis 就会忽略这一调用,转而以默认的查找顺序查找日志工具。

    关于 SLF4J、Apache Commons Logging、Apache Log4J 和 JDK Logging 的 API 介绍不在本文档介绍范围内。不过,下面的例子可以作为一个快速入门。关于这些日志框架的更多信息,可以参考以下链接:

    你可以对包、映射类的全限定名、命名空间或全限定语句名开启日志功能来查看 MyBatis 的日志语句。

    再次说明下,具体怎么做,由使用的日志工具决定,这里以 SLF4J(Logback) 为例。配置日志功能非常简单:添加一个或多个配置文件(如 logback.xml),有时需要添加 jar 包。下面的例子将使用 SLF4J(Logback) 来配置完整的日志服务,共两个步骤:

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

    对于 web 应用或企业级应用,则需要将 logback-classic.jar, logback-core.jar and slf4j-api.jar 添加到 WEB-INF/lib 目录下;对于独立应用,可以将它添加到JVM 的 -classpath 启动参数中。

    If you use the maven, you can download jar files by adding following settings on your pom.xml.

    1. <dependency>
    2. <groupId>ch.qos.logback</groupId>
    3. <artifactId>logback-classic</artifactId>
    4. <version>1.x.x</version>
    5. </dependency>

    步骤 2:配置 Logback

    配置 Logback 比较简单,假如你需要记录这个映射器接口的日志:

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

    在应用的类路径中创建一个名称为 logback.xml 的文件,文件的具体内容如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE configuration>
    3. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    4. <encoder>
    5. <pattern>%5level [%thread] - %msg%n</pattern>
    6. </encoder>
    7. </appender>
    8. <level value="trace"/>
    9. </logger>
    10. <root level="error">
    11. <appender-ref ref="stdout"/>
    12. </root>
    13. </configuration>

    添加以上配置后,SLF4J(Logback) 就会记录 org.mybatis.example.BlogMapper 的详细执行操作,且仅记录应用中其它类的错误信息(若有)。

    你也可以将日志的记录方式从接口级别切换到语句级别,从而实现更细粒度的控制。如下配置只对 selectBlog 语句记录日志:

    与此相对,可以对一组映射器接口记录日志,只要对映射器接口所在的包开启日志功能即可:

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

    某些查询可能会返回庞大的结果集,此时只想记录其执行的 SQL 语句而不想记录结果该怎么办?为此,Mybatis 中 SQL 语句的日志级别被设为DEBUG(JDK 日志设为 FINE),结果的日志级别为 TRACE(JDK 日志设为 FINER)。所以,只要将日志级别调整为 DEBUG 即可达到目的:

    1. <logger name="org.mybatis.example">
    2. <level value="debug"/>
    3. </logger>
    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="org.mybatis.example.BlogMapper">
    6. <select id="selectBlog" resultType="Blog">
    7. select * from Blog where id = #{id}
    8. </select>
    9. </mapper>

    如需对 XML 文件记录日志,只要对命名空间增加日志记录功能即可:

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

    要记录具体语句的日志可以这样做:

    你应该注意到了,为映射器接口和 XML 文件添加日志功能的语句毫无差别。

    注意 如果你使用的是 SLF4J 或 Log4j 2,MyBatis 将以 MYBATIS 这个值进行调用。

    配置文件 log4j.properties 的余下内容是针对日志输出源的,这一内容已经超出本文档范围。关于 Logback 的更多内容,可以参考 的网站。不过,你也可以简单地做做实验,看看不同的配置会产生怎样的效果。

    Configuration example for Log4j 2

    pom.xml

    1. <dependency>
    2. <groupId>org.apache.logging.log4j</groupId>
    3. <artifactId>log4j-core</artifactId>
    4. </dependency>

    log4j2.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Configuration xmlns="http://logging.apache.org/log4j/2.0/config">
    3. <Appenders>
    4. <Console name="stdout" target="SYSTEM_OUT">
    5. <PatternLayout pattern="%5level [%t] - %msg%n"/>
    6. </Console>
    7. </Appenders>
    8. <Loggers>
    9. <Logger name="org.mybatis.example.BlogMapper" level="trace"/>
    10. <Root level="error" >
    11. <AppenderRef ref="stdout"/>
    12. </Root>
    13. </Loggers>
    14. </Configuration>

    Configuration example for Log4j

    pom.xml

    1. <dependency>
    2. <groupId>log4j</groupId>
    3. <artifactId>log4j</artifactId>
    4. <version>1.2.17</version>
    5. </dependency>
    1. log4j.rootLogger=ERROR, stdout
    2. log4j.logger.org.mybatis.example.BlogMapper=TRACE
    3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    4. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    Configuration example for JDK logging