MyBatis日志

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


MyBatis日志

本文转自   手不要乱摸  51CTO博客,原文链接:http://blog.51cto.com/5880861/1750493

上一篇:Spring Boot集成Mybatis中如何显示日志


下一篇:Java精品公开课合集 | 技术日报(13期)