- <dependencies>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
- <dependency>
- <groupId>org.mybatis.spring.bootgroupId>
- <artifactId>mybatis-spring-boot-starterartifactId>
- <version>2.2.2version>
- dependency>
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <scope>runtimescope>
- dependency>
-
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druid-spring-boot-starterartifactId>
- <version>1.2.6version>
- dependency>
-
- dependencies>
- import java.sql.SQLException;
- import java.time.temporal.TemporalAccessor;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
-
- import org.springframework.stereotype.Component;
-
- import com.alibaba.druid.DbType;
- import com.alibaba.druid.filter.FilterChain;
- import com.alibaba.druid.filter.FilterEventAdapter;
- import com.alibaba.druid.proxy.jdbc.JdbcParameter;
- import com.alibaba.druid.proxy.jdbc.ResultSetProxy;
- import com.alibaba.druid.proxy.jdbc.StatementProxy;
- import com.alibaba.druid.sql.SQLUtils;
- import com.alibaba.druid.util.StringUtils;
-
-
- @Component("sqlLogInterceptor")
- public class SqlLogInterceptor extends FilterEventAdapter {
-
- private static final SQLUtils.FormatOption FORMAT_OPTION = new SQLUtils.FormatOption(false, false);
-
- private static final List
SQL_LOG_EXCLUDE = new ArrayList<>(Arrays.asList("ACT_RU_JOB", "ACT_RU_TIMER_JOB")); -
-
- @Override
- protected void statementExecuteBefore(StatementProxy statement, String sql) {
- statement.setLastExecuteStartNano();
- }
-
- @Override
- protected void statementExecuteBatchBefore(StatementProxy statement) {
- statement.setLastExecuteStartNano();
- }
-
- @Override
- protected void statementExecuteUpdateBefore(StatementProxy statement, String sql) {
- statement.setLastExecuteStartNano();
- }
-
- @Override
- protected void statementExecuteQueryBefore(StatementProxy statement, String sql) {
- statement.setLastExecuteStartNano();
- }
-
- @Override
- protected void statementExecuteAfter(StatementProxy statement, String sql, boolean firstResult) {
- statement.setLastExecuteTimeNano();
- }
-
- @Override
- protected void statementExecuteBatchAfter(StatementProxy statement, int[] result) {
- statement.setLastExecuteTimeNano();
- }
-
- @Override
- protected void statementExecuteQueryAfter(StatementProxy statement, String sql, ResultSetProxy resultSet) {
- statement.setLastExecuteTimeNano();
- }
-
- @Override
- protected void statementExecuteUpdateAfter(StatementProxy statement, String sql, int updateCount) {
- statement.setLastExecuteTimeNano();
- }
-
- @Override
- public void statement_close(FilterChain chain, StatementProxy statement) throws SQLException {
- // 打印可执行的 sql
- String sql = statement.getBatchSql();
- // sql 为空直接返回
- if (StringUtils.isEmpty(sql)) {
- chain.statement_close(statement);
- return;
- }
- // sql 包含排除的关键字直接返回
- if (excludeSql(sql)) {
- chain.statement_close(statement);
- return;
- }
- int parametersSize = statement.getParametersSize();
- List
- for (int i = 0; i < parametersSize; ++i) {
- // 转换参数,处理 java8 时间
- parameters.add(getJdbcParameter(statement.getParameter(i)));
- }
- String dbType = statement.getConnectionProxy().getDirectDataSource().getDbType();
- String formattedSql = SQLUtils.format(sql, DbType.of(dbType), parameters, FORMAT_OPTION);
- printSql(formattedSql, statement);
- chain.statement_close(statement);
- }
-
- private static Object getJdbcParameter(JdbcParameter jdbcParam) {
- if (jdbcParam == null) {
- return null;
- }
- Object value = jdbcParam.getValue();
- // 处理 java8 时间
- if (value instanceof TemporalAccessor) {
- return value.toString();
- }
- return value;
- }
-
- private static void printSql(String sql, StatementProxy statement) {
- // 打印 sql
- String sqlLogger = "\n\n============== Sql Start ==============" +
- "\nExecute SQL : %s" +
- "\nExecute Time: %d" +
- "\n============== Sql End ==============\n";
- String msg = String.format(sqlLogger, sql.trim(), statement.getLastExecuteTimeNano());
- System.err.println(msg);
- }
-
- private static boolean excludeSql(String sql) {
- // 判断关键字
- for (String exclude : SQL_LOG_EXCLUDE) {
- if (sql.contains(exclude)) {
- return true;
- }
- }
- return false;
- }
-
- }

