log4j2列印Mybatis執行的SQL語句及SQL語句的執行時間
阿新 • • 發佈:2019-01-09
有關於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> <!-- 將druid連線池的sql語句列印到日誌檔案中 --> <logger name="druid.sql.Statement" level="debug" additivity="false"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileName"/> </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 configuration
PUBLIC "-//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 configuration
PUBLIC "-//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 ]
寫在最後:如需轉載,請註明出處,如果有什麼問題,歡迎在評論區詢問