GrailsでSQLステートメントをログに記録する方法


86

パフォーマンスを確認するために、Grailsが実行するすべてのクエリをコンソールまたはファイルにログインしたいと思います。

私はこれをうまく構成していませんでした。

どんなアイデアでも役に立ちます。


提供されたソリューションはどれも私にはうまくいきませんでした。私がどうしても必死になっていることをみんなに知らせるためにこれを書いています。
アンドレア

回答:


131

設定

datasource {
...
logSql = true
}

DataSource.groovy(これらの手順に従って)で、私の環境で機能させるのに十分でした。FAQの一部が古くなっているようです(たとえば、「多対多の列が逆になっている」という質問)。そのため、これもその間に変更されたものである可能性があります。


6
logSql=true一人では十分ではありません。Hibernateロギングもオンにする必要があります。@Peteの回答を参照してください。
ジェイソン

2
これには、「?」が含まれるSQLステートメントに含まれる値が含まれていないことに気付きました。
ジェイソン

1
これは機能しますが、すべてのクエリに対してです。logSql = trueを設定せずに、特定の基準に対して生成されたSQLを出力することも可能ですか?
8

@Guus特定の基準に対して生成されたSQLを出力するにはどうすればよいですか?
biniam 2015年

@biniam_Ethiopia私の知る限り、これは不可能です。これが欲しいだけでなく、特定のクラスをデバッグするのが面倒で、他のクエリも表示したくないのです。
8

91

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

8
私はこれを何度も使用しました。注意すべき1つのこと:パラメータの出力は非常にコストがかかります。開発ボックスでのみこれを行うことをお勧めします。
ジョンゴードン

2
format_sql = truehibernateブロックに追加してDataSource.groovy、適切にフォーマットされた出力を作成することもできます。
グレゴールペトリン2014年

1
注:これにより、クエリ結果セットから抽出されたwhere句パラメータと列値の両方がログに記録されます。where句のパラメータのみをログに記録するには、trace 'org.hibernate.type.BasicBinder'
GreenGiant 2015

Grails 3.3.8に相当するものを知っている人はいますか?
ジョンリトル

何らかの理由で、構文的に無効なクエリ(残念ながら、Hibernate自体によって生成されたもの)はログに記録されません-他のすべてのクエリはログに記録されます...おそらくHibernate自体に問題がありますか?
ジャナカバンダラ

31

Grails3の場合*

オプション#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

17

これを試して:

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

これにより、Hibernatetypeパッケージのトレースログのパフォーマンスの問題が回避されます。これはHibernate3.6以降で機能します。私はこれをhttps://burtbeckwith.com/blog/?p=1604から入手しました


6

ソリューションは開発専用であり、本番用ではありません。

上記のすべての答えは機能し、正しいです。しかし、人間が読める形式で完全なクエリを表示するわけではありません。最終的な(?、?なしの)クエリを表示する場合は、2つのオプションがあります。

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 

3

参照用にのみ純粋ですが、SQLクエリをログに記録するためにp6spyを使用しています。これは小さな中間jdbcドライバーです。正確なクエリは、サーバーに送信されるときにログに記録されます(パラメーターが含まれます)。

あなたのプロジェクトにそれを含めてください:

runtime 'p6spy:p6spy:3.0.0'

データソースドライバーを変更します。

driverClassName: com.p6spy.engine.spy.P6SpyDriver

そしてあなたのjdbcurl:

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

本番環境ではこれを無効にすることを忘れないでください!


2

次は私のために働きます:

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/


1

私はこれがずっと前に尋ねられ、答えられたことを知っています。しかし、私はたまたまこの質問を見て、私たちのプロジェクトで私たちのSQLロギング実装アプローチに答えたり共有したりするのを止めることができませんでした。お役に立てば幸いです。

現在、開発環境にあります。「log4jdbcDriverSpy」を使用してSQLをログに記録しています。

構成:

BuildConfig.groovyで:以下の依存関係を追加します:

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

そして、データソースまたはその他の関連する構成で:[データソース関連の構成を定義した場所]、追加:

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/

キングよろしく


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

0

コンソールプラグインがインストールされている場合は、この小さなコードスニペットを使用して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
}

これは上記のソリューションの多くのバリエーションですが、実行時に値を微調整することができます。そして、それを扱う他のソリューションと同じように、logToStdoutクエリのみを表示し、バインド値は表示しません。

このアイデアは、数年前に読んだburtbeckwithの投稿から盗まれたもので、現在は見つかりません。Grails3.3で動作するように編集されています。

同様の手法を使用して、特定の統合テストのロギングをオンにすることができます。

class SomeIntegrationSpec extends IntegrationSpec {

    def sessionFactory

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

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

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

これにより、この1つのファイルのテストのみのSQLログがオンになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.