Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Grails中记录SQL语句_Sql_Logging_Grails - Fatal编程技术网

如何在Grails中记录SQL语句

如何在Grails中记录SQL语句,sql,logging,grails,Sql,Logging,Grails,我想登录到控制台或一个文件(Grails执行的所有查询)来检查性能 我没有成功 任何想法都会有帮助。设置 datasource { ... logSql = true } groovy(按照说明)足够让它在我的环境中工作。似乎FAQ的某些部分已经过时(例如,多对多列向后问题),因此这也可能是同时发生了变化的原因。我发现执行以下操作更有用,即启用Hibernate日志记录SQL和绑定变量(这样您就可以看到传递到调用中的值,并在编辑器或其他地方轻松复制SQL) 在Config.groovy中,将以

我想登录到控制台或一个文件(Grails执行的所有查询)来检查性能

我没有成功

任何想法都会有帮助。

设置

datasource {
...
logSql = true
}

groovy(按照说明)足够让它在我的环境中工作。似乎FAQ的某些部分已经过时(例如,多对多列向后问题),因此这也可能是同时发生了变化的原因。

我发现执行以下操作更有用,即启用Hibernate日志记录SQL和绑定变量(这样您就可以看到传递到调用中的值,并在编辑器或其他地方轻松复制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
    // ...
    }
试试这个:

log4j = {
   ...
   debug 'org.hibernate.SQL'
   trace 'org.hibernate.type.descriptor.sql.BasicBinder'
}

它避免了跟踪记录Hibernate
类型
包的性能问题。这适用于Hibernate 3.6及更高版本。我是从:

解决方案仅用于开发,不用于生产

上面的所有答案都是正确的。但是它们并没有以一种良好的人类可读的方式显示完整的查询。如果想要查看最终的(没有任何?,?)查询,您有两个选项

A) 使用log4jdbc或p6Spy代理您的jdbc连接

B) 在数据库级别上查看它。例如,使用mysql真的很容易

找出常规日志文件的位置。如果尚未激活,则激活常规日志

mysql command line> show variables like "%general_log%";
mysql command line> set global general_log = true;
现在,所有内容都记录到您的日志文件中。Mac/linux示例显示了您的查询流

tail -f path_to_log_file 

我知道这个问题很久以前就已经被问过了,但我只是碰巧看到了这个问题,我无法阻止自己在项目中回答或分享我们的sql日志实现方法。 希望能有所帮助

目前它处于开发环境中。 我们使用“log4jdbc驱动程序间谍”来记录sql

配置: 在BuildConfig.groovy中: 添加以下依赖项:

dependencies {
.....
runtime 'org.lazyluke:log4jdbc-remix:0.2.7'
}
在您的数据源或其他与配置相关的文件中:[无论您在何处定义了与数据源相关的配置], 加:

根据我个人的经验,我发现它在调试时非常有用。 你也可以在这个网站上找到更多信息

国王向圣杯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中。但是,这种方法不记录参数值

environments:
  local:
    dataSource:
        logSql: true
        formatSql: true

对于特定的代码块,我们还可以创建一个接受闭包的方法。例如

 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")}

Pure仅供参考,但我使用p6spy记录SQL查询。它是一个小型的中间jdbc驱动程序。准确的查询将被记录,因为它将被发送到服务器(包括参数)

将其包括在项目中:

runtime 'p6spy:p6spy:3.0.0'
更改数据源驱动程序:

driverClassName: com.p6spy.engine.spy.P6SpyDriver
以及您的jdbc url:

url: jdbc:p6spy:mysql://
使用spy.properties(在grails app/conf中)配置它

别忘了在生产中禁用它

如果您安装了插件,您可以使用这个小代码片段获取sql日志记录

// grails 2.3
def logger=ctx.sessionFactory.settings.sqlStatementLogger

// grails 3.3  
def logger = ctx.sessionFactory.currentSession.jdbcCoordinator.statementPreparer.jdbcService.sqlStatementLogger

logger.logToStdout=true    
try {
   <code that will log sql queries>
}
finally {
    logger.logToStdout = false
}
这将打开此文件中测试的sql日志记录。

下一步对我有用:

grails app/conf/application.yml
#。。。
冬眠:

format_sql:true#我已经使用过很多次了。需要注意的一点是:输出参数非常昂贵。我建议您只在dev框上执行此操作。您还可以将
format_sql=true
添加到
DataSource.groovy的
hibernate
块中,以获得格式良好的输出。注意:这将记录where子句参数和从查询结果集中提取的列值。要仅记录where子句参数,请使用
trace'org.hibernate.type.BasicBinder'
是否有人知道grails 3.3.8的等效项?出于某种原因,语法无效的查询(遗憾的是,由hibernate本身生成!)不会被记录-所有其他查询都会被记录。。。Hibernate本身可能存在问题?
logSql=true
本身是不够的。Hibernate日志记录也必须打开。请参阅@Pete的答案。我注意到这不包括SQL语句中“?”所在的值。这是有效的,但适用于所有查询。是否也可以打印为特定条件生成的sql而不必设置logSql=true?@Guus如何打印为特定条件生成的sql?@biniam_据我所知,这是不可能的。我想要这个,因为调试某些类和不想看到其他查询都很烦人。提供的任何解决方案都不适合我。我写这篇文章只是想让大家知道我是多么绝望。
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
// grails 2.3
def logger=ctx.sessionFactory.settings.sqlStatementLogger

// grails 3.3  
def logger = ctx.sessionFactory.currentSession.jdbcCoordinator.statementPreparer.jdbcService.sqlStatementLogger

logger.logToStdout=true    
try {
   <code that will log sql queries>
}
finally {
    logger.logToStdout = false
}
class SomeIntegrationSpec extends IntegrationSpec {

    def sessionFactory

    def setup() {
        sessionFactory.settings.sqlStatementLogger.logToStdout = true
    }

    def cleanup() {
        sessionFactory.settings.sqlStatementLogger.logToStdout = false
    }

    void "some test"() {
           ...
    }