MyBatis日志信息配置
使用MyBatis的时候,经常需要输出SQL语句、参数信息、查询结 果等日志信息,为此MyBatis也提供了非常简单有效的解决方案。MyBatis内置的日志工厂提供日志功能,具体的日志实现有以下几 种工具:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j
- JDK logging
具体选择哪个日志实现工具由MyBatis的内置日志工厂决定。它会使用最先找到的(按上文列举的顺序查找)如果一个都未找到,日志功能就会被禁用,不少应用服务器的 classpath 中已经包含 Apache Commons Logging,如 Tomcat 和WebShpere,所以MyBatis会把它作为具体的日志 实现。记住这点非常重要。这将意味着,在诸如 WebSphere的环境中ü WebSphere提供了Apache Commons Logging的私有实现,你的Log4j配置 将被忽略。不过,如果你的应用部署在一个包含Apache Commons Logging的环境里,而你又想用其他的日志框架比如Log4j,可以通过在MyBatis的配置文件mybatis-config.xml里面添加一项setting(配置)来选 择一个不同的日志实现。这也是MyBatis推荐的做法
<configuration>
<settings>
...
<setting name="logImpl" value="LOG4J"/>
...
</settings>
</configuration>
这样就是告诉MyBatis当前项目的日志实现使用Log4j,Log4j的配 置信息就会起作用。
logImpl可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、 COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING 或者是 实现了接口org.apache.ibatis.logging.Log的类的完全限定类名,并且这个 类的构造函数需要以一个字符串(String类型)为参数。具体可以参考org.apache.ibatis.logging.slf4j.Slf4jImpl.java
的实现
MyBatis可以对包、类、命名空间和全限定的语句记录日志。
具体怎么做,视使用的日志框架而定,这里以Log4j为例。配置日志功能非常简单:首先增加依赖的jar包,如log4j.jar,log4j.jar可以直接在mybatis-3.4.5解压文件夹下的lib文件夹中找到,也可以自己去官网下载,再添加配置文件,有log4j.properties或log4j.xml两种,下面分别讲解 两种配置文件
log4j.properties配置日志
例如需要记录这个mapper接口的日志:
package org.davieyang.mapper;
public interface UserMapper{
@Select("SELECT * FROM tb_user WHERE id = #{id}")
User selectUser(int id);
}
在应用的CLASSPATH中增加一个名称为log4j.properties的文件,文 件的具体内容如下:
# 全局日志环境变量
log4j.rootLogger=ERROR, stdout
# MyBatis日志环境配置
log4j.logger.org.davieyang.mapper.UserMapper=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
添加以上配置后,Log4j就会把org.davieyang.mapper.UserMapper的TRACE(详细执行)日志记录下来,对于应用中的其他类则仅仅记录 ERROR(错误信息),也可以将日志从整个mapper接口级别调整到语句级别,从而实现更 细粒度的控制。如下配置只记录 selectUser 语句的日志:
log4j.logger.org.davieyang.mapper.UserMapper.selectUser=TRACE
也可以对一组mapper接口记录日志,只要对mapper接口所在的包开 启日志功能即可:
log4j.logger.org.davieyang.mapper=TRACE
某些查询可能会返回大量的数据,如果只想记录其执行的 SQL 语 句该怎么办?为此,MyBatis中SQL语句的日志级别被设为 DEBUG(JDK Logging中为FINE),结果日志的级别为TRACE(JDK Logging中为FINER).所以,只要将日志级别调整为DEBUG即可:
log4j.logger.org.davieyang.mapper=DEBUG
如果要记录日志的是类似下面的mapper文件而不是mapper接口又该如何处理
<?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.davieyang.mapper.UserMapper">
<select id="selectUser" resultType="Blog">
select * from tb_user where id= #{id}
</select>
</mapper>
只要对命名空间增加日志记录功能即可:log4j.logger.org.davieyang.mapper=TRACE
log4j.xml配置日志
之前的Java项目都是采取properties文件作为配置文件,而最新的项 目大多采用XML文件作为配置文件。在应用的CLASSPATH中增加一个名称为log4j.xml的文件,文件的 具体内容如下:
<?xml version"1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%5p [%t] - %m%n"/>
</layout>
</appender>
<logger name="org.davieyang.mapper.UserMapper">
<level value="TRACE"/>
</logger>
<root>
<level value="ERROR"/>
<appender-ref ref="STDOUT">
</root>
</log4j:configuration>
添加以上配置后,Log4j就会把 org.davieyang.mapper.UserMapper的TRACE(详细执行)日志记录下来,对于应用中的其他类则仅仅记录 ERROR(错误信息),也可以将日志从整个mapper接口级别调整到语句级别,从而实现更细粒度的控制。如下配置只记录 selectUser 语句的日志:
<logger name="org.davieyang.mapper.UserMapper.selectUser">
<level value="TRACE">
</logger>
也可以对一组mapper接口记录日志,只要对mapper接口所在的包开 启日志功能即可:
<logger name="org.davieyang.mapper">
<level value="TRACE">
</logger>
某些查询可能会返回大量的数据,如果只想记录其执行的 SQL 语 句该怎么办?为此,MyBatis中SQL语句的日志级别被设为 DEBUG(JDK Logging中为FINE),结果日志的级别为TRACE(JDK Logging中为FINER)。所以,只要将日志级别调整为DEBUG即可:
<logger name="org.davieyang.mapper">
<level value="DEBUG">
</logger>
如果要记录日志的是类似下面的mapper文件而不是mapper接口又该如何处理
<?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.davieyang.mapper.UserMapper">
<select id="selectUser" resultType="Blog">
select * from tb_user where id=#{id}
</select>
</mapper>
只要对命名空间增加日志记录功能即可:
<logger name="org.davieyang.mapper.UserMapper">
<level value="TRACE">
</logger>