Logging
MyBatis通过内部的日志工厂提供日志信息。内部的日志工厂委托下列之一的日志工具来具体实现日志:
-
SLF4J
-
Apache Commons Logging
-
Log4j 2
-
Log4j
-
JDK logging
具体使用哪个日志工具是由Log Factory在运行时决定的。MyBatis log factory把他找到 第一个日志工具作为它的日志实现(查找的顺序就是上面列出的顺序)。如果MyBatis一个都没有找到,那么MyBatis的日志输出将不可用。
许多环境把Commons Logging作为应用服务器类路径的一部分(典型的例子是Tomcat和WebSphere)。在这种环境中,MyBatis使用Commons Logging作为日志实现。在像WebSphere这种环境下,你的Log4j配置将被忽略,因为它自己提供了Commons Logging的实现。这是非常令人沮丧的,因为MyBatis忽略了你的Log4j配置(事实上,MyBatis忽略你的Log4j配置是因为在这样的环境下它使用Commons Logging)。如果你的应用程序运行在classpath已经包含Commons Logging的环境下,而你又想用其它的日志实现,这种情况下,你可以在mybatis-config.xml中添加如下配置已选择一个不同的日志实现:
<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.LogFactory.useSlf4jLogging(); org.apache.ibatis.logging.LogFactory.useLog4JLogging(); org.apache.ibatis.logging.LogFactory.useLog4J2Logging(); org.apache.ibatis.logging.LogFactory.useJdkLogging(); org.apache.ibatis.logging.LogFactory.useCommonsLogging(); org.apache.ibatis.logging.LogFactory.useStdOutLogging();
这些方法只是用于切换请求日志的具体实现,前提是这些实现在classpath中都是可用的。比如,你选择Log4j,但是Log4j在运行时不可用,那么MyBatis将忽略到Log4j的日志请求,然后按照正常的逻辑重新选择日志实现。
SLF4J, Apache Commons Logging, Apache Log4J and the JDK Logging这些API的使用不在本文档的讲解范围内,但是下面有一个例子来讲解如何使用。如果你想更多的了解这些日志框架,你可以从下列地址得到更多信息:
Logging Configuration
为了查看MyBatis的日志语句,你能够将日志打在一个包、一个mapper的完全限定类名、一个命名空间或者一个完全限定的语句名。
下面我们将展示怎样用Log4j来实现。配置日志是一件很简单的事情,只需引入一个或多个配置文件(比如:log4j.properties)和一些Jar包(比如:log4j.jar)即可。下面的示例配置就展示了如何使用log4j来作为日志服务,这在第2步。
Step 1: Add the Log4J JAR file
因为要使用Log4j,所以我们必须确保jar包在我们的应用程序中是可用的,为了使用Log4j,你需要添加jar文件到你的应用程序classpath中。
Step 2: Configure Log4J
配置log4j是很简单的,假如你希望日志对于下面这个Mapper是可用的:
package org.mybatis.example;public interface BlogMapper { @Select("SELECT * FROM blog WHERE id = #{id}") Blog selectBlog(int id); }
在classpath中创建一个名字叫log4j.properties的文件:
# Global logging configuration log4j.rootLogger=ERROR, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
上面这段配置将导致log4j报告org.mybatis.example.BlogMapper的详细日志和应用程序中其它类中ERROR级别的日志。
如果你只想查看特定的语句的日志,而不是整个Mapper文件,那么你只需要这样配置:
log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
相反,你可能想要记录所以Mapper的日志,那么你需要这样配置:
log4j.logger.org.mybatis.example=TRACE
这里有个问题,这样配置的话中会有大量的结果集包含在日志中,而事实上你可能只是想看SQL语句而不是返回的结果集。出于这样的考虑,SQL语句的日志级别是DEBUG,而结果集的日志级别是TRACE,所以万一你只想看SQL语句而不关心结果集的话,你可以将级别设置诶DEBUG。
log4j.logger.org.mybatis.example=DEBUG
但是,如果你不是用mapper接口,而是用mapper xml文件呢?就像下面这样:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" " <mapper namespace="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper>
这种情况下,你可以在命名空间上添加一个logger来记录整个xml的日志了
log4j.logger.org.mybatis.example.BlogMapper=TRACE
或者是某个特定的SQL语句
log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
是的,正如你看到的那样,在mapper接口和在mapper xml文件上配置日志是没有区别的。
原文:http://www.mybatis.org/mybatis-3/logging.html
本文转自 手不要乱摸 51CTO博客,原文链接:http://blog.51cto.com/5880861/1750493