使用Druid LogFilter打印可执行的sql(转)

有不少人问如何在输出 sql 的同时输出查询所用的参数,再转发 @dreamlu 的一篇博文,希望对大家有用:

通常在java项目开发为了防止sql注入我们通常都采用的预编译的sql,采用“?”号挂参,如下:

SELECT * FROM blog WHERE id = ?

往往在开发测试阶段能获取到完整的可执行的sql能帮我们及时的发现和定位问题。就有了很多朋友使用log4jdbc来记录SQL信息

Druid中LogFilter的配置项

如下图我们可以看到有一项statementExecutableSqlLogEnable默认为false


druid-logfilter.png

配置

这里我们以JFinal和Log4j最为演示的例子

java代码

// 配置Druid数据库连接池插件
DruidPlugin druidPlugin = new DruidPlugin(jdbcUrl, user, password);

// 配置log插件
Log4jFilter logFilter = new Log4jFilter();
logFilter.setStatementLogEnabled(false);
logFilter.setStatementLogErrorEnabled(true);
logFilter.setStatementExecutableSqlLogEnable(true);

druidPlugin.addFilter(logFilter);

log4j.properties中添加

log4j.logger.druid.sql.Statement=DEBUG

druid中支持的日志Filter

Log4jFilter
Slf4jLogFilter
Log4j2Filter
CommonsLogFilter


原文链接:http://www.dreamlu.net/druid/jfinal/2017/09/22/Print-executable-SQL-using-the-Druid-LogFilter.html

评论区

suxiaoqiuking

2018-01-14 13:07

好用

快乐的蹦豆子

2018-01-16 15:42

挺好的

livem

2018-01-18 13:44

good job

livem

2018-01-18 13:46

存在另一个问题,打印出来的 sql 执行日志,durid 默认把 sql 格式化为多行的 sql 了,不知道 durid 是否可以配置为不格式化为【多行】sql 么?请教~~~

JFinal

2018-01-18 16:06

@livem 这个得看看 druid 的官方文档了, jfinal 不干预这件事情

livem

2018-01-18 19:03

@JFinal 恩,不是 jfinal 干的,是 druid 干的;查了一下文档没找到可配置的地方;看了一下 druid 源码,在 LogFilter.logExecutableSql 方法里面调用了 SQLUtils.format ,但是是写死的,没提供可选择配置参数;看了一眼最新版的 druid ,也是一样的。

JFinal

2018-01-18 19:26

@livem 改改他的源代码,这就是开源的好处之一

livem

2018-01-20 08:44

https://github.com/jfinal/jfinal/issues/105

原来这块调试,我在 2016年11月调试过,自己完全忘记了,哈哈哈哈~~~

dev3932

2018-01-24 12:48

- - 按上面的配置还是不行 参数还是?代替

chenjie2017

2018-03-01 18:26

@JFinal 我照这个配也还是?

年轻人

2019-03-24 22:38

原文链接似乎已失效

JFinal

2019-03-25 20:32

@年轻人 druid 官方文档中有关于 filter 的扩展,扩展很容易

热门分享

扫码入社