9.3 MyBatis日志信息配置 9.3.1 log4j.properties配置日志

9.3 MyBatis日志信息配置

使用MyBatis的时候,经常需要输出SQL语句、参数信息、查询结果等日志信息,为此MyBatis也提供了非常简单有效的解决方案。

MyBatis内容的日志功能

MyBatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具

  • SLF4J
  • Apache Commons Logging
  • Log4j2
  • Log4j
  • JDK logging

具体选择哪个日志实现工具由MyBatis的内置日志工厂决定。它会使用最先找到的按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。

不少应用服务器的classpath中己经包含Apache Commons Logging,如TomcatWebShpere,所以MyBatis会把它作为具体的日志实现。记住这点非常重要。这将意味着在诸如WebSphere的环境中WebSphere提供了Apache Commons Logging的私有实现,你的Log4j配置将被忽略。
不过,如果你的应用部署在一个包含Apache Commons Logging的环境里,而你又想用其他的日志框架比如Log4j,可以通过在MyBatis的配置文件mybatis-config.xml里面添加一项setting(配置)来选择一个不同的日志实现。这也是MyBatis推荐的做法

使用Log4j

mybatis的配置文件mybatis-config.xml中添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- XML 配置文件包含对 MyBatis 系统的核心设置 -->
<configuration>
......
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
......
</configuration>

这样就是告诉MyBatis当前项目的日志实现使用Log4j,Log4j的配置信息就会起作用。

logImpl属性值

logImpl可选的值有:SLF4JLOG4JLOG4J2JDK_LOGINGCOMMONS_LOGINGSTDOUT_LOGGINGNO_LOGGING或者是实现了接口org.apache.ibatis.logging.Log的类的完全限定类名,并且这个类的构造函数需要以一个字符串(String类型)为参数。具体可以参考org.apache.ibatis.logging.slf4j.Slf4jImpl.java的实现。

下载log4j的jar包

从mybatis-版本解压目录下的lib目录中找到

log4j.jar可以直接在mybatis-版本解压文件夹下的lib文件夹中找到:

G:\Desktop\随书源码\库文件\mybatis-3.5.2\lib
├─ant-1.10.3.jar
├─ant-launcher-1.10.3.jar
├─asm-7.0.jar
├─cglib-3.2.10.jar
├─commons-logging-1.2.jar
├─javassist-3.24.1-GA.jar
├─log4j-1.2.17.jar
├─log4j-api-2.11.2.jar
├─log4j-core-2.11.2.jar
├─ognl-3.2.10.jar
├─slf4j-api-1.7.26.jar
└─slf4j-log4j12-1.7.26.jar

官网下载

也可以自己去官网下载.

Mybatis配置log4j日志步骤

MyBatis可以对包、类、命名空间和全限定的语句记录日志.
具体怎么做,视使用的日志框架而定,这里以Log4j为例。配置日志功能非常简单:

  • 首先增加依赖的jar包,如log4j.jar
  • 再添加配置文件,有log4j.propertieslog4j.xml两种,下面分别讲解两种配置文件。

添加log4j的配置文件

添加配置文件,有log4j.propertieslog4j.xml两种,下面分别讲解两种配置文件

9.3.1 log4j.properties配置日志

对mapper接口的日志配置

比如需要记录org.fkit.mapper包下的这个UserMapper接口的日志:

1
2
3
4
5
package org.fkit.mapper;
public interface UserMapper{
@Select("select FROM tb_user where id =#{id}")
User selectUser(int id);
}

在应用的CLASSPATH中增加一个名称为log4j.properties的文件,文件的具体内容如下:

# 全局日志环境配置
log4j.root.Logger=ERROR, stdout
# MyBatis日志环境配置...
log4j.logger.org.fkit.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.fkit.mapper.UserMapperTRACE(详细执行)日志记录下来,对于应用中的其他类则仅仅记录ERROR(错误信息)。

语句级别的日志

也可以将日志从整个mapper接口级别调整到语句级别,从而实现更细粒度的控制。如下配置只记录selectUser语句的日志:

1
log4j.logger.org.fkit.mapper.UserMapper.selectUser=TRACE

包级别的日志

也可以对一组mapper接口记录日志,只要对mapper接口所在的包开启日志功能即可:

1
log4j.logger.org.fkit.mapper=TRACE

某些查询可能会返回大量的数据,如果只想记录其执行的SQL语句该怎么办? 为此,MyBatisSQL语句的日志级别被设为DEBUGJDK Logging中为FINE),结果日志的级别为TRACEJDK Logging中为FINER)。所以,只要将日志级别调整为DEBUG即可:

1
log4j.logger.org.fkit.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">
<!-- namespace指用户自定义的命名空间。 -->
<mapper namespace="org.fkit.mapper.UserMapper">
    <insert
        id="saveUser"
        parameterType="user"
        useGeneratedKeys="true"
        keyProperty="id"> insert into tb_user(name,sex,age) values(#{name},#{sex},#{age})
    </insert>
</mapper>

只要对命名空间增加日志记录功能即可:

log4j.logger.org.fkit.mapper=TRACE