如何在Grails中记录SQL语句

时间:2010-04-02 18:51:04

标签: sql logging grails

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

我已配置this但未成功。

任何想法都会有所帮助。

10 个答案:

答案 0 :(得分:125)

设置

datasource {
...
logSql = true
}
DataSource.groovy中的

(根据these说明)足以让它在我的环境中运行。似乎FAQ的部分内容已经过时(例如“向后多对多列”问题),所以这可能也会在此期间发生变化。

答案 1 :(得分: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
    // ...
    }

答案 2 :(得分:31)

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。但是,此方法不会记录参数值

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

答案 3 :(得分:17)

试试这个:

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

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

得到了这个

答案 4 :(得分:5)

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

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

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;

现在所有内容都记录到您的日志文件中。 Mac / linux示例显示您的查询的精彩流。

tail -f path_to_log_file 

答案 5 :(得分:3)

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

将其包含在您的项目中:

runtime 'p6spy:p6spy:3.0.0'

更改数据源驱动程序:

driverClassName: com.p6spy.engine.spy.P6SpyDriver

你的jdbc网址:

url: jdbc:p6spy:mysql://

使用spy.properties(在grails-app / conf中)配置它。

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

别忘了禁用此产品进行生产!

答案 6 :(得分:1)

我知道这有问题并且很久才回答。但我刚刚碰巧看到这个问题并且无法在我们的项目中回答或分享我们的sql日志记录实现方法。 希望它有所帮助。

目前正处于开发环境中。 我们正在使用" log4jdbc Driver Spy"记录sql。

配置:

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

dependencies {
.....
runtime 'org.lazyluke:log4jdbc-remix:0.2.7'
}

在您的DataSource或其他相关配置中:[无论您在何处定义了与数据源相关的配置], 添加:

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'

}

根据我的个人经验,我发现它在调试时非常有用且有用。 您还可以在此站点中找到更多信息。 https://code.google.com/p/log4jdbc-remix/

King Regards

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

如果安装了console插件,则可以使用此小代码段获取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 {
    logToStdout = false
}

这是上述许多解决方案的变体,但允许您在运行时调整值。就像处理logToStdout的其他解决方案一样,它仅显示查询而不显示绑定值。

我几年前读过一篇我现在找不到的文章,这个想法是从伯克贝克的一篇文章中被窃取的。已对其进行编辑以与grails 3.3一起使用。

可以使用类似的技术来打开特定集成测试的日志记录:

class SomeIntegrationSpec extends IntegrationSpec {

    def sessionFactory

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

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

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

这将仅为该文件中的测试打开sql日志记录。

答案 9 :(得分:0)

下一个对我有用:

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:...
# ...

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
// ...

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