log4j2打印Mybatis执行的SQL语句及SQL语句的执行时间

来源:互联网 发布:js随机数1到22 编辑:程序博客网 时间:2024/06/05 02:26

有关于log4j2的详细配置方式,建议大家观看log4j2配置文件详解,这里不做介绍

一、首先如需使用log4j2,得引入maven依赖

<!-- log4j2 --><dependency>            <groupId>org.apache.logging.log4j</groupId>            <artifactId>log4j-api</artifactId>            <version>${log4j2.version}</version>        </dependency>        <dependency>            <groupId>org.apache.logging.log4j</groupId>            <artifactId>log4j-core</artifactId>            <version>${log4j2.version}</version>        </dependency><dependency>             <groupId>org.apache.logging.log4j</groupId>             <artifactId>log4j-web</artifactId>             <version>${log4j2.version}</version>        </dependency>

注:本人使用的是2.7版本的log4j2

二、然后在项目的classpath下编写log4j2.xml

log4j2在启动的时候会默认加载名为log4j2.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>    <Configuration status="OFF" monitorInterval="1800">          <properties>        <!-- log打印到本地的路径 -->          <property name="LOG_HOME">D:/log4j2/mybatis/genertor/logs/</property>          <property name="ERROR_LOG_FILE_NAME">error</property>      </properties>        <Appenders>        <!-- 控制台打印日志 -->          <Console name="Console" target="SYSTEM_OUT">                <PatternLayout pattern="%d %-5p (%F:%L) - %m%n" />            </Console>      <!-- 日志信息输出到文件配置 -->          <RollingRandomAccessFile name="ErrorLog"                                     fileName="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log"                                     filePattern="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log.%d{yyyy-MM-dd}.gz">                <PatternLayout                        pattern="%d %-5p (%F:%L) - %m%n"/>                <Policies>                  <!-- TimeBasedTriggeringPolicy指定的size是1,结合起来就是1天生成一个新文件。如果filePattern改成%d{yyyy-MM-dd HH}.gz,此时最小粒度为小时,则每一个小时生成一个文件。 -->                  <TimeBasedTriggeringPolicy/>                    <!--  指定当文件体积大于size指定的值时,触发Rolling -->                  <SizeBasedTriggeringPolicy size="100 MB"/>                </Policies>              <!-- 指定最多保存的文件个数 -->                <DefaultRolloverStrategy max="20"/>            </RollingRandomAccessFile>            <param name="Encoding" value="UTF-8" />      </Appenders>            <Loggers>            <!-- 3rdparty Loggers -->            <logger name="org.springframework.core" level="info">            </logger>            <logger name="org.springframework.beans" level="info">            </logger>            <logger name="org.springframework.context" level="info">            </logger>            <logger name="org.springframework.web" level="info">            </logger>            <logger name="org.springframework.test.context.junit4.SpringJUnit4ClassRunner" level="info">            </logger>            <!-- 下面的logger需要修改为你的项目根路径,如com.sd -->          <logger name="com.stu" level="debug" includeLocation="true" additivity="false">              <appender-ref ref="ErrorLog"/>                <appender-ref ref="Console"/>            </logger>                <root level="info" includeLocation="true">              <appender-ref ref="ErrorLog"/>              <appender-ref ref="Console"/>            </root>        </Loggers>    </Configuration>  

三、在web.xml中配置log4j2的加载启动

<!-- log4j2-begin -->     <listener>        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>     </listener>     <filter>         <filter-name>log4jServletFilter</filter-name>        <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>     </filter>     <filter-mapping>         <filter-name>log4jServletFilter</filter-name>         <url-pattern>/*</url-pattern>        <dispatcher>REQUEST</dispatcher>         <dispatcher>FORWARD</dispatcher>         <dispatcher>INCLUDE</dispatcher>         <dispatcher>ERROR</dispatcher>     </filter-mapping>     <!-- log4j2-end -->
注:加上上述配置后,就能在项目启动是加载log4j2

四、在Mybatis的配置文件中,加入上述配置

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <!-- 使用log4j2打印查询语句 --><settings>        <setting name="logImpl" value="LOG4J2" />    </settings></configuration>
注:settings配置完毕后,即可实现SQL语句的打印!控制台打印如下结果:
2017-10-23 16:38:01,021 DEBUG (BaseJdbcLogger.java:145) - ==>  Preparing: SELECT count(*) FROM t_user 2017-10-23 16:38:01,056 DEBUG (BaseJdbcLogger.java:145) - ==> Parameters: 2017-10-23 16:38:01,084 DEBUG (BaseJdbcLogger.java:145) - <==      Total: 1

五、实现Mybatis官方提供的拦截器,用于记录SQL语句的执行时间

package com.stu.interceptor;import java.sql.Statement;import java.util.Properties;import org.apache.ibatis.executor.statement.StatementHandler;import org.apache.ibatis.plugin.Interceptor;import org.apache.ibatis.plugin.Intercepts;import org.apache.ibatis.plugin.Invocation;import org.apache.ibatis.plugin.Plugin;import org.apache.ibatis.plugin.Signature;import org.apache.ibatis.session.ResultHandler;/** * Sql执行时间记录拦截器  */@Intercepts({@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}), @Signature(type = StatementHandler.class, method = "update", args = {Statement.class}), @Signature(type = StatementHandler.class, method = "batch", args = { Statement.class })})public class SqlCostInterceptor implements Interceptor {  @Override public Object intercept(Invocation invocation) throws Throwable {     long startTime = System.currentTimeMillis();  try {   return invocation.proceed();  } finally {   long endTime = System.currentTimeMillis();   long sqlCost = endTime - startTime;   System.out.println("执行耗时 : [" + sqlCost + "ms ] ");  } }  @Override public Object plugin(Object target) {  return Plugin.wrap(target, this); }  @Override public void setProperties(Properties properties) {    }  }
注:Interceptor接口是Mybatis官方提供的拦截接口,创建一个类实现该接口并重写其三个方法并将该类配置在Mybatis的配置文件中,即可拦截SQL语句的执行过程

六、将手动编写的拦截器配置在Mybatis配置文件中:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <!-- 使用log4j2打印查询语句 --><settings>        <setting name="logImpl" value="LOG4J2" />    </settings><typeAliases><package name="com.stu.pojo" /></typeAliases><plugins><!-- 拦截器配置 --><plugin interceptor="com.stu.interceptor.SqlCostInterceptor" /></plugins></configuration>

七、测试SQL的控制台打印结果

2017-10-23 16:38:01,091 DEBUG (BaseJdbcLogger.java:145) - ==>  Preparing: select id, username, password, state, isdel, add_time, money, left_money from t_user limit ?,? 2017-10-23 16:38:01,093 DEBUG (BaseJdbcLogger.java:145) - ==> Parameters: 0(Integer), 15(Integer)2017-10-23 16:38:01,128 DEBUG (BaseJdbcLogger.java:145) - <==      Total: 15执行耗时 : [36ms ] 

写在最后:如需转载,请注明出处,如果有什么问题,欢迎在评论区询问













原创粉丝点击