jfinal / jfinal

JAVA WEB + ORM Framework
https://jfinal.com
Apache License 2.0
3.24k stars 1.32k forks source link

showsql 日志可否把 sql 的参数都打印出来呢? #105

Closed livem closed 7 years ago

livem commented 7 years ago

项目里面,现在用的是

jfinal-1.9-bin-with-src.jar

我通过这句开启了 showsql 日志:

SqlReporter.setLogger(true);

但是,打印出来的只有 sql 语句,没有相应填进去的参数,不知可否也打印出来?查日志也方便许多

我自己翻了一下代码,看到:

com.jfinal.plugin.activerecord.SqlReporterinvoke 方法,应该要把整个 Object[] args 数组打印出来,应该就可以了。

再者,我用的是 com.alibaba.druid 来连接数据库的,druid 应该也可以配置打印 sql 日志 + sql参数。

yaxiLiu commented 7 years ago

发自网易邮箱大师 在2016年11月17日 13:04,bill Cheng 写道:

项目里面,现在用的是

jfinal-1.9-bin-with-src.jar

我通过这句开启了 showsql 日志:

SqlReporter.setLogger(true);

但是,打印出来的只有 sql 语句,没有相应填进去的参数,不知可否也打印出来?查日志也方便许多

我自己翻了一下代码,看到:

com.jfinal.plugin.activerecord.SqlReporter 的 invoke 方法,应该要把整个 Object[] args 数组打印出来,应该就可以了。

再者,我用的是 com.alibaba.druid 来连接数据库的,druid 应该也可以配置打印 sql 日志。

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

jfinal commented 7 years ago

打印 sql 的参数没那么方便, Object[] args 这个并不是 sql 用到的参数。 想做这个功能倒不难,只是代码不优雅,需要将参数不断传递过来,所以暂不支持,大家可以尝试有没有优雅的方案,找到极简方案可以提反馈给我

livem commented 7 years ago

Object[] args 这个并不是 sql 用到的参数

原来这样,开启com.alibaba.druid的日志,应该可以做到。

livem commented 7 years ago

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

如果使用 alibaba druid 连接池,则可以配置输出可执行的SQL

但是,不知道怎么在 jfinal JFinalConfig 的代码里面,配置 com.alibaba.druid.filter.logging.Log4jFilter 的属性 statementExecutableSqlLogEnabletrue

DruidPlugin 这个类可以做么?

jfinal commented 7 years ago

必然是可以的,先创建 Log4jFilter ,然后通过 druidPlugin.addFilter(...) 添加进去即可,所有的 filter 都可以这样添加,记得搞定后,回来再分享一下,感谢

livem commented 7 years ago

原来这样,先谢谢。搞定我再发一篇blog记录一下 :)

发自网易邮箱大师 在2016年11月29日 21:00,James Zhan 写道:

必然是可以的,先创建 Log4jFilter ,然后通过 druidPlugin.addFilter(...) 添加进去即可,所有的 filter 都可以这样添加,记得搞定后,回来再分享一下,感谢

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or mute the thread.

livem commented 7 years ago
Slf4jLogFilter sql_log_filter = new Slf4jLogFilter();
StatFilter sql_stat_filter = new StatFilter();

sql_log_filter.setConnectionLogEnabled(false);
sql_log_filter.setStatementLogEnabled(false);
sql_log_filter.setStatementExecutableSqlLogEnable(true);
sql_log_filter.setResultSetLogEnabled(false);

// 慢sql记录
sql_stat_filter.setSlowSqlMillis(3 * 1000);
sql_stat_filter.setLogSlowSql(true);

DruidPlugin dbPlugin = new DruidPlugin('url', 'user', 'pass');

dbPlugin
.setFilters("stat")
.addFilter(sql_log_filter)
.addFilter(sql_stat_filter);

如果是使用 alibaba druid 数据库连接池的项目,通过上述代码, 并且 logback 的日志等级要调到 debug ,就可以完整输出 sql + sql 参数 的了。

jfinal commented 7 years ago

感谢回来分享,这个功能,确实有很多人问起过,有空去 jfinal 社区坐坐哈 http://www.jfinal.com

livem commented 7 years ago

那么快关单了。。。我还以为看看能不能在 jfinal 里面实现这个功能。。。

jfinal commented 7 years ago

@livem jfinal 里面可以实现这个功能,但是代码不优雅,这种功能还是直接用底层的现成的功能最好,毕竟 Druid 天然就是做这个事的,不重复发明轮子

livem commented 7 years ago

也是

livem commented 7 years ago

上面关于 druid 的代码,主要是它 wiki 上面没有 slf4jjfinal 的例子,所以花了点时间来调试上面的配置项。

tda7088 commented 6 years ago

有的项目不能用druid,比如有时用weblogic的jndi数据源,有没有好一些的方案呢,现在只能实现showsql,打印不了参数值

livem commented 6 years ago

http://www.jfinal.com/share/621

livem commented 6 years ago

@tda7088 log4jdbc

yydzxz commented 2 years ago
Slf4jLogFilter sql_log_filter = new Slf4jLogFilter();
StatFilter sql_stat_filter = new StatFilter();

sql_log_filter.setConnectionLogEnabled(false);
sql_log_filter.setStatementLogEnabled(false);
sql_log_filter.setStatementExecutableSqlLogEnable(true);
sql_log_filter.setResultSetLogEnabled(false);

// 慢sql记录
sql_stat_filter.setSlowSqlMillis(3 * 1000);
sql_stat_filter.setLogSlowSql(true);

DruidPlugin dbPlugin = new DruidPlugin('url', 'user', 'pass');

dbPlugin
.setFilters("stat")
.addFilter(sql_log_filter)
.addFilter(sql_stat_filter);

如果是使用 alibaba druid 数据库连接池的项目,通过上述代码, 并且 logback 的日志等级要调到 debug ,就可以完整输出 sql + sql 参数 的了。

jfinal 3.3需要加一句 ......省略...... dp.setFilters("stat") .addFilter(sql_log_filter) .addFilter(sql_stat_filter); dp.start();//加这一句 ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);