Как записывать операторы SQL в Grails - PullRequest
79 голосов
/ 02 апреля 2010

Я хочу войти в консоль или в файл, все запросы, которые Grails делает, чтобы проверить производительность.

Я настроил это безуспешно.

Любая идея поможет.

Ответы [ 10 ]

127 голосов
/ 02 апреля 2010

Настройка

datasource {
...
logSql = true
}

в DataSource.groovy (согласно этим инструкциям) было достаточно, чтобы заставить его работать в моей среде. Похоже, что части FAQ устарели (например, вопрос «столбцы многие-ко-многим в обратном направлении»), так что это может также быть чем-то, что изменилось за это время.

89 голосов
/ 14 декабря 2011

Я считаю более полезным сделать следующее, то есть включить ведение журнала 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
    // ...
    }
31 голосов
/ 16 июня 2015

Для Грааля 3. *

Опция # 1 добавить следующее в logback.groovy

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

или

Опция # 2 добавляет следующее в dataSource в application.yml. Однако этот подход не регистрирует значения параметров

environments:
  local:
    dataSource:
        logSql: true
        formatSql: true
17 голосов
/ 24 февраля 2014

Попробуйте это:

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

Это позволяет избежать проблем с производительностью трассировки журнала пакета Hibernate type. Это работает с Hibernate 3.6 и выше. Я получил это от: https://burtbeckwith.com/blog/?p=1604

5 голосов
/ 14 мая 2014

Решение только для разработки, а не производства.

Все ответы выше работают и являются правильными.Но они не показывают полный запрос в удобной для человека форме.Если вы хотите увидеть окончательный (без каких-либо?,?) Запрос, у вас есть два варианта.

A) прокси-соединение вашего jdbc с log4jdbc или p6Spy.

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 голосов
/ 10 февраля 2017

Только для справки, но я использую 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).

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

Не забудьте отключить это для производства!

1 голос
/ 01 августа 2014

Я знаю, что об этом спрашивали и отвечали давным-давно. Но я просто случайно увидел этот вопрос и не мог удержаться от того, чтобы ответить или поделиться нашим подходом к реализации ведения логов 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/

Король С уважением

0 голосов
/ 11 января 2019

Следующие работы для меня:

Grails-приложение / 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-приложение / 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/

0 голосов
/ 19 августа 2018

Если у вас установлен плагин 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, он показывает только запросы, а не значения привязки.

Идея была украдена из поста Бертбека с постом, который я прочитал несколько лет назад и который сейчас не могу найти. Отредактировано для работы с граалями 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 только для тестов в этом одном файле.

0 голосов
/ 22 апреля 2016

Для конкретного блока кода мы также можем создать метод, который принимает закрытие. например.

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