如何在Grails中loggingSQL语句
我想要login控制台或文件,Grails所做的所有查询来检查性能。
我configuration了这个没有成功。
任何想法都会有帮助。
设置
datasource { ... logSql = true }
在DataSource.groovy(按照这些说明)足以让它在我的环境中工作。 似乎常见问题的部分内容已经过时(例如,“多对多列向后”的问题),所以这也可能是同时发生的变化。
我觉得这样做更有用,这是为了让Hibernate的日志logging和绑定variables一起loggingSQL(这样你就可以看到传入你的调用的值,并且很容易地在你的编辑器或其他方面复制SQL)。
在你的Config.groovy
,将以下内容添加到你的log4j块中:
log4j = { // Enable Hibernate SQL logging with param values trace 'org.hibernate.type' debug 'org.hibernate.SQL' //the rest of your logging config // ... }
对于Grails 3. *
选项#1将以下内容添加到logback.groovy
logger("org.hibernate.SQL", DEBUG, ["STDOUT"], false) logger("org.hibernate.type.descriptor.sql.BasicBinder", TRACE, ["STDOUT"], false)
要么
选项#2将以下内容添加到application.yml中的dataSource中。 但是这种方法不logging参数值
environments: local: dataSource: logSql: true formatSql: true
尝试这个:
log4j = { ... debug 'org.hibernate.SQL' trace 'org.hibernate.type.descriptor.sql.BasicBinder' }
它避免了Hibernate type
包跟踪logging的性能问题。 这适用于Hibernate 3.6及以上版本。 我从https://burtbeckwith.com/blog/?p=1604得到了这个;
解决scheme仅用于开发,而不是生产。
以上所有的答案都是正确的。 但是他们并没有以完美的人类可读的方式显示完整的查询。 如果想查看最后的(没有任何?,?)查询,你有两个select。
A)用log4jdbc或p6Spy代理你的jdbc连接。
B)在数据库级别上查看它。 比如用mysql真的很容易。
找出你的general_log_file在哪里。 活动的通用日志如果尚未激活。
mysql command line> show variables like "%general_log%"; mysql command line> set global general_log = true;
现在一切都logging到你的日志文件。 Mac / linux的例子,以显示您的查询很好的stream。
tail -f path_to_log_file
纯仅供参考,但我使用p6spy来loggingSQL查询。 这是一个小的中间jdbc驱动程序。 确切的查询被logging下来,因为它将被发送到服务器(包括参数)。
将其包含在您的项目中:
runtime 'p6spy:p6spy:3.0.0'
更改您的数据源驱动程序:
driverClassName: com.p6spy.engine.spy.P6SpyDriver
和你的jdbcurl:
url: jdbc:p6spy:mysql://
使用spy.properties(在grails-app / conf中)configuration它。
driverlist=org.h2.Driver,com.mysql.jdbc.Driver autoflush=true appender=com.p6spy.engine.spy.appender.StdoutLogger databaseDialectDateFormat=yyyy-MM-dd logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
不要忘记禁用这个生产!
我知道这个问题已经被回答了很长时间,但是我碰巧看到这个问题,并且无法阻止自己在我们的项目中回答或分享我们的SQL日志实施方法。 希望它有一些帮助。
目前处于开发环境。 我们使用“log4jdbc Driver Spy”来loggingsql。
组态:
在你的BuildConfig.groovy:添加下面的依赖关系:
dependencies { ..... runtime 'org.lazyluke:log4jdbc-remix:0.2.7' }
并在你的数据源或其他相关的configuration:[无论你已经定义数据源相关的configuration],添加:
datasources{ ..... driverClassName: "net.sf.log4jdbc.DriverSpy", url: "jdbc:log4jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = XXXXX.XX>XXX)(PORT = 1521))) (CONNECT_DATA = (SID = XXXX)(SERVER =DEDICATED)))", .... } log4j = { info 'jdbc.sqlonly' //, 'jdbc.resultsettable' }
从我个人的经验来看,我发现它在debugging时非常有用和有用。 还有更多的信息,你可以在这个网站find。 https://code.google.com/p/log4jdbc-remix/
国王的问候
对于特定的代码块,我们也可以创build一个接受闭包的方法。 例如。
static def executeBlockAndGenerateSqlLogs(Closure closure) { Logger sqlLogger = Logger.getLogger("org.hibernate.SQL"); Level currentLevel = sqlLogger.level sqlLogger.setLevel(Level.TRACE) def result = closure.call() sqlLogger.setLevel(currentLevel) result } executeBlockAndGenerateSqlLogs{DomainClazz.findByPropertyName("property value")}