Comment enregistrer les instructions SQL dans Grails

Je veux me connecter à la console ou dans un fichier, toutes les requêtes que Grails fait, pour vérifier les performances.

J'avais configuré ce, sans succès.

Toute idée aiderait.

77
demandé sur Beryllium 2010-04-02 22:51:04

9 réponses

Réglage

datasource {
...
logSql = true
}

Dans La Source De Données.groovy (selon CES instructions ) était suffisant pour le faire fonctionner dans mon environnement. Il semble que certaines parties de la FAQ soient obsolètes (par exemple, "la question plusieurs à plusieurs colonnes en arrière"), donc cela pourrait aussi être quelque chose qui a changé entre-temps.

123
répondu Tomislav Nakic-Alfirevic 2018-01-02 15:32:42

Je trouve plus utile de faire ce qui suit, qui est d'activer la journalisation D'Hibernate pour enregistrer le SQL avec les variables de liaison (de sorte que vous pouvez voir les valeurs passées dans vos appels, et répliquer facilement le SQL dans votre éditeur ou autrement).

Dans votre Config.groovy, Ajoutez ce qui suit à votre bloc log4j:

log4j = {

    // Enable Hibernate SQL logging with param values
    trace 'org.hibernate.type'
    debug 'org.hibernate.SQL'
    //the rest of your logging config
    // ...
    }
88
répondu Peter 2016-07-07 04:46:38

Pour graal 3.*

Option # 1 Ajoutez ce qui suit à logback.groovy

logger("org.hibernate.SQL", DEBUG, ["STDOUT"], false)
logger("org.hibernate.type.descriptor.sql.BasicBinder", TRACE, ["STDOUT"], false)

Ou

Option # 2 Ajoutez ce qui suit à dataSource dans l'application.yml. Cependant, cette approche ne consigne pas les valeurs des paramètres

environments:
  local:
    dataSource:
        logSql: true
        formatSql: true
30
répondu Robert Hutto 2015-06-16 01:19:41

Essayez ceci:

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

Il évite les problèmes de performance de la journalisation de trace du package Hibernate type. Cela fonctionne avec Hibernate 3.6 et supérieur. Je l'ai obtenu de: https://burtbeckwith.com/blog/?p=1604

16
répondu Jason 2014-02-24 17:38:35

Solution est seulement pour le développement, pas la production.

Toutes les réponses ci-dessus sont correctes. Mais ils ne montrent pas la requête complète d'une manière lisible par l'homme. Si vous voulez voir la finale (sans aucun?, ? requête de), vous avez deux options.

A) proxy votre connexion jdbc avec log4jdbc ou p6Spy.

B) regardez-le au niveau de la base de données. Par exemple vraiment facile à faire avec mysql.

Découvrez où vous general_log_file est. Journal général actif si non activé déjà.

mysql command line> show variables like "%general_log%";
mysql command line> set global general_log = true;

Maintenant, tout est enregistré dans votre fichier journal. Exemple Mac / linux pour afficher un bon flux de vos requêtes.

tail -f path_to_log_file 
5
répondu Wuestenfuchs 2014-05-14 18:25:31

Pur pour référence seulement, mais j'utilise p6spy pour enregistrer les requêtes SQL. C'est un petit pilote JDBC intermédiaire. La requête exacte est consignée comme elle serait envoyée au serveur (avec les paramètres inclus).

Incluez - le dans votre projet:

runtime 'p6spy:p6spy:3.0.0'

Modifiez votre pilote de source de données:

driverClassName: com.p6spy.engine.spy.P6SpyDriver

Et votre url jdbc:

url: jdbc:p6spy:mysql://

Configurez-le en utilisant spy.propriétés (dans 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

N'oubliez pas de désactiver ceci pour la production!

3
répondu Dennie de Lange 2017-02-10 00:25:20

Je sais que cela a été demandé et répondu longtemps .Mais je viens de voir cette question et je ne pouvais pas m'empêcher de répondre ou de partager notre approche d'implémentation de journalisation sql dans notre projet. Espérons qu'il sera de peu d'aide.

Actuellement, il est dans l'environnement de développement. Nous utilisons "Log4jdbc Driver Spy" pour enregistrer sql.

Configuration:

Dans votre BuildConfig.groovy: ajouter des dépendances ci-dessous:

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

Et dans votre source de données ou autre config liée: [où que vous ont défini la configuration liée à la source de données] , Ajouter:

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'

}

D'après mon expérience personnelle, je l'ai trouvé très utile et utile lors du débogage. Également plus d'informations que vous pouvez trouver dans ce site. https://code.google.com/p/log4jdbc-remix/

Roi Salutations

1
répondu Madhu Bose 2014-08-01 16:25:24

Pour un Bloc de code particulier, nous pouvons également créer une méthode qui acceptent de fermeture. par exemple.

 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
répondu user3180264 2016-05-24 07:09:26

Si vous avez installé le plugin console, vous pouvez obtenir la journalisation sql avec ce petit extrait de code.

ctx.sessionFactory.settings.sqlStatementLogger.logToStdout = true
try {
   <code that will log sql queries>
}
finally {
    ctx.sessionFactory.settings.sqlStatementLogger.logToStdout = false
}

Ceci est une variation sur la plupart des solutions ci-dessus, mais vous permet de modifier la valeur au moment de l'exécution. Et tout comme les autres solutions qui traitent de logToStdout, il ne montre que les requêtes et non les valeurs de liaison.

L'idée a été volée dans un post de burtbeckwith que j'ai lu il y a quelques années et que je ne trouve pas pour l'instant.

Une technique similaire peut être utilisée pour tourner lors de la journalisation pour des tests d'intégration spécifiques:

class SomeIntegrationSpec extends IntegrationSpec {

    def sessionFactory

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

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

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

Cela activera la journalisation sql pour seulement les tests dans ce fichier.

0
répondu burns 2018-08-19 18:47:22