极简打印可执行sql方案

package cn.com.qtgl.config;

import cn.hutool.log.Log;
import com.alibaba.druid.filter.FilterAdapter;
import com.alibaba.druid.filter.FilterChain;
import com.alibaba.druid.proxy.jdbc.StatementProxy;
import com.alibaba.druid.sql.SQLUtils;
import com.mysql.jdbc.PreparedStatement;

import java.sql.SQLException;

/**
 * @author 
 * @version 1.0
 * @date 2019/12/3 16:34
 * 打印可执行sql语句
 */
public class SqlLogFilter extends FilterAdapter {
    private static final Log log = Log.get();
    private static final SQLUtils.FormatOption FORMAT_OPTION = new SQLUtils.FormatOption(false, false);

    @Override
    public void statement_close(FilterChain chain, StatementProxy statement) throws SQLException {
        if (log.isDebugEnabled()) {
            if (statement.getRawObject() instanceof PreparedStatement) {
                PreparedStatement preparedStatement = (PreparedStatement) statement.getRawObject();
                String sql = preparedStatement.asSql();
                //定制sql输出格式,可以去掉
                sql = SQLUtils.formatMySql(sql, FORMAT_OPTION);
                log.debug("sql:{}", sql);
            }
        }
        super.statement_close(chain, statement);
    }
}


如果使用8.x的mysql 驱动  可以使用ClientPreparedStatement这个类

以上配置仅试用mysql,如果要支持其他数据可以使用通用配置支持所有数据库

Slf4jLogFilter LOG_FILTER = new Slf4jLogFilter();
LOG_FILTER.setStatementExecutableSqlLogEnable(true);
LOG_FILTER.setResultSetLogEnabled(false);
LOG_FILTER.setConnectionLogEnabled(false);
LOG_FILTER.setDataSourceLogEnabled(false);
LOG_FILTER.setStatementCreateAfterLogEnabled(false);
LOG_FILTER.setStatementPrepareAfterLogEnabled(false);
LOG_FILTER.setStatementPrepareCallAfterLogEnabled(false);
LOG_FILTER.setStatementExecuteAfterLogEnabled(false);
LOG_FILTER.setStatementExecuteQueryAfterLogEnabled(false);
//不进行格式化
LOG_FILTER.setStatementSqlFormatOption(new SQLUtils.FormatOption(false, false));
LOG_FILTER.setStatementExecuteUpdateAfterLogEnabled(false);
LOG_FILTER.setStatementExecuteBatchAfterLogEnabled(false);
LOG_FILTER.setStatementCloseAfterLogEnabled(false);
LOG_FILTER.setStatementParameterSetLogEnabled(false);
LOG_FILTER.setStatementParameterClearLogEnable(false);
LOG_FILTER.setStatementLogErrorEnabled(false);


评论区

李通

2020-08-27 15:11

druid的版本是什么

chcode

2020-08-27 15:36

yuwen01

2021-05-11 10:58

@chcode 为啥我用了后没有打印出sql语句?

chcode

2021-05-11 12:03

@yuwen01 把这个类的日志级别设置为debug

chcode

2021-05-11 12:08

@yuwen01 还有你要在druid 中注册这个filter

yuwen01

2021-05-11 16:38

@chcode filter已经注册了,日志级别要修改哪一个,我项目有log4j.properties和logging.properties

yuwen01

2021-05-11 16:48

@chcode 解决了log4j.properties日志级别设置为debug(log4j.rootLogger=DEBUG, stdout, file)

热门分享

扫码入社