使用log4j2打印mybatis的sql执行日志方式
作者:PacosonSWJTU
log4j2打印mybatis的sql执行日志
maven配置jar包依赖
如下:
<!-- 日志jar --> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.11.1</version> </dependency> </dependencies>
配置log4j2.xml文件
内容如下:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l %msg%n"/> </Console> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="Console"/> </Root> <Logger name="com.swjtu.crud.dao" level="DEBUG or TRACE" additivity="false"> <AppenderRef ref="Console"/> </Logger> </Loggers> </Configuration>
Logger 标签 配置了需要打印日志的mapper(Mapper类或mapper XML 文件所在包)
Logger标签中的 level属性取值为 DEBUG 或者 TRACE,(取其一)
mybatis配置文件
mybatis-config.xml中设置日志的工具类
如下:
<?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"> <configuration> <properties resource="dbconfig.properties"> </properties> <settings> <!-- 驼峰命名规则 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 配置日志工具 --> <setting name="logImpl" value="LOG4J2" /> </settings> <typeAliases> <package name="com.swjtu.crud.bean" /> </typeAliases> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> </plugins> <environments default="development"> <!-- 开发环境 --> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com\swjtu\crud\dao\dept.mapper.xml"/> </mappers> </configuration>
日志打印效果
20:35:28.742 [main] DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:181) ==> Preparing: SELECT dept_id AS DEPT_ID , dept_name AS DEPT_NAME FROM dept_tbl WHERE rcrd_id IN ( ? , ? , ? )
20:35:28.786 [main] DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:181) ==> Parameters: 1(String), 2(String), 3(String)
20:35:28.807 [main] DEBUG org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:181) <== Total: 3
打印sql为:
<!-- 查询部门列表 --> <select id="getDeptList" resultType="map"> SELECT dept_id AS DEPT_ID , dept_name AS DEPT_NAME FROM dept_tbl WHERE rcrd_id IN ( <foreach collection="LIST" item="item" separator=", "> #{item} </foreach> ) </select>
配置Log4j,使得MyBatis打印出SQL语句
环境参数
- JDK:jdk1.8.0_25
- IDE:Eclipse Luna Servie Release 1
- 框架:Spring 4.1.5 + SpringMVC 4.1.5 + MyBatis 3.2.2
配置步骤
一、设置MyBatis的Setting(非必须,不同环境下,可能不需要该设置)。
在“src/main/java/resources”目录下,创建mybatis-config.xml文件,并且输入下列内容。
<?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"> <configuration> <settings> <setting name="lazyLoadingEnabled" value="false" /> <setting name="logImpl" value="LOG4J" /> </settings> </configuration>
二、配置log4j的配置文件。
不同的项目中,log4j的配置文件的格式可能不同,在一些项目中,log4j的配置文件是XML格式的,比如log4j.xml;在另一些项目中,log4j的配置文件是properties格式的,比如log4j.properties。
备注:properties格式文件的配置一般只在老的项目中存在,新的互联网类项目,一般都是XML格式。
1、对于properties格式文件的配置。
###############Log4j 4 SQL Output start################# log4j.logger.com.xxx.mydao=DEBUG log4j.logger.com.springframework=DEBUG log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl=DEBUG log4j.logger.java.sql=DEBUG,CONSOLE ###############Log4j 4 SQL Output end###################
2、对于xml格式文件的配置。
<loggers> <!-- name可以指定包名或具体的类;additivity如果指定true,则root logger也会生效,相同日志会输出两次;false,则只有当前日志文件输出 --> <!-- 借据插入接口日志 --> <logger level="info" name="insertCreditBill" additivity="false"> <appender-ref ref="insertCreditBillLog" /> </logger> <!-- 下面是打印通过log4j2打印出mybatis语句的配置--> <logger name="com.xxx.mydao"> <level>DEBUG</level> </logger> <logger name="com.springframework"> <level>DEBUG</level> </logger> <logger name="com.ibatis" additivity="true"> <level>DEBUG</level> </logger> <logger name="com.ibatis.common.jdbc.SimpleDataSource" additivity="true"> <level>DEBUG</level> </logger> <logger name="com.ibatis.common.jdbc.ScriptRunner" additivity="true"> <level>DEBUG</level> </logger> <logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" additivity="true"> <level>DEBUG</level> </logger> <logger name="Java.sql.Connection" additivity="true"> <level>DEBUG</level> </logger> <logger name="java.sql.Statement" additivity="true"> <level>DEBUG</level> </logger> <logger name="java.sql.PreparedStatement" additivity="true"> <level>DEBUG</level> </logger> <logger name="java.sql.ResultSet" additivity="true"> <level>DEBUG</level> </logger> <logger name="org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl" additivity="true"> <level>DEBUG</level> </logger> <!-- root logger,任何其它的logger最终都相当于继承自 root logger --> <root level="INFO"> <appenderRef ref="Console" /> <appenderRef ref="FileLog"></appenderRef> </root> </loggers>
说明:
上述配置中,“com.xxx.mydao”为自己项目中MyBatis的所有的mapper和xml文件所在的包名字。
至此,log4j的打印SQL语句的配置完成。
3、XML格式配置的精简版本
<loggers> <!-- 下面是打印通过log4j2打印出mybatis语句的配置--> <logger name="com.xxx.mydao"> <level>DEBUG</level> </logger> <!-- root logger,任何其它的logger最终都相当于继承自 root logger --> <root level="INFO"> <appenderRef ref="Console" /> <appenderRef ref="FileLog"></appenderRef> </root> </loggers>
说明:
在开发中,需要配置让哪个包下的程序打印出SQL,则仅仅只用配置那一个包名就成。
上述配置中,“com.xxx.mydao”为自己项目中MyBatis的mapper和xml文件所在的包名字,因此,精简版中,仅仅配置了这个包的内容
拓展
“细粒度”控制:Log4j打印出MyBatis中仅仅单个Mapper的配置。
<!-- 下面是通过配置log4j2,仅仅打印出单个mapper的SQL语句的配置--> <logger name="com.beebank.dao.iface.UserMapper"> <level>DEBUG</level> </logger>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。