如何在Grails中记录SQL语句

use*_*427 82 sql grails logging

我想登录控制台或文件,Grails所做的所有查询,以检查性能.

我没有成功配置这个.

任何想法都会有帮助.

Tom*_*vic 127

设置

datasource {
...
logSql = true
}
Run Code Online (Sandbox Code Playgroud)

在DataSource.groovy中(根据这些说明)足以让它在我的环境中工作.似乎FAQ的部分已经过时(例如"向后多对多列"问题),所以这可能也会在此期间发生变化.

  • 单独`logSql = true`是不够的.还必须打开Hibernate日志记录.见@ Pete的回答. (6认同)
  • 我注意到这不包括"?"所在的SQL语句中的值. (2认同)

Pet*_*ter 89

我发现执行以下操作更有用,即使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
    // ...
    }
Run Code Online (Sandbox Code Playgroud)

  • 我已经多次使用过了.有一点需要注意:输出参数非常昂贵.我建议只在你的开发盒上这样做. (7认同)
  • 您还可以将`format_sql = true`添加到`DataSource.groovy`的`hibernate`块中,以获得格式良好的输出. (2认同)
  • 注意:这将记录从查询结果集中提取的 where 子句参数和列值。要仅记录 where 子句参数,请使用 `trace 'org.hibernate.type.BasicBinder'` (2认同)

Rob*_*tto 31

为grails 3.*

选项#1将以下内容添加到logback.groovy

logger("org.hibernate.SQL", DEBUG, ["STDOUT"], false)
logger("org.hibernate.type.descriptor.sql.BasicBinder", TRACE, ["STDOUT"], false)
Run Code Online (Sandbox Code Playgroud)

要么

选项#2将以下内容添加到application.yml中的dataSource.但是,此方法不记录参数值

environments:
  local:
    dataSource:
        logSql: true
        formatSql: true
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 17

试试这个:

log4j = {
   ...
   debug 'org.hibernate.SQL'
   trace 'org.hibernate.type.descriptor.sql.BasicBinder'
}
Run Code Online (Sandbox Code Playgroud)

它避免了Hibernate type包跟踪日志记录的性能问题.这适用于Hibernate 3.6及更高版本.我得到了这个:https://burtbeckwith.com/blog/?p = 1604


小智 6

解决方案仅适用于开发,而非生产.

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

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;
Run Code Online (Sandbox Code Playgroud)

现在一切都记录到您的日志文件中.Mac/linux示例显示您的查询的精彩流.

tail -f path_to_log_file 
Run Code Online (Sandbox Code Playgroud)


Edu*_*omo 5

接下来对我有用:

grails-app/conf/application.yml

# ...
hibernate:
    format_sql: true # <<<<<<< ADD THIS <<<<<<<
    cache:
        queries: false
        use_second_level_cache: true
# ...
environments:
    development:
        dataSource:
            logSql: true // <<<<<<< ADD THIS <<<<<<<
            dbCreate: create-drop
            url: jdbc:h2:mem:...
# ...
Run Code Online (Sandbox Code Playgroud)

grails-app/conf/logback.groovy

// ...
appender('STDOUT', ConsoleAppender) {
    encoder(PatternLayoutEncoder) {
        pattern = "%level %logger - %msg%n"
    }
}

// >>>>>>> ADD IT >>>>>>>
logger 'org.hibernate.type.descriptor.sql.BasicBinder', TRACE, ['STDOUT']
logger 'org.hibernate.SQL', TRACE, ['STDOUT']
// <<<<<<< ADD IT <<<<<<<

root(ERROR, ['STDOUT'])

def targetDir = BuildSettings.TARGET_DIR
// ...
Run Code Online (Sandbox Code Playgroud)

来源: http: //sergiodelamo.es/log-sql-grails-3-app/