Как регистрировать SQL-запросы в Grails

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

Я сконфигурировал этот без успеха.

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

Ответ 1

настройка

datasource {
...
logSql = true
}

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

Ответ 2

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

Ответ 3

Для грайлей 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

Ответ 4

Попробуйте следующее:

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

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

Ответ 5

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

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

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 

Ответ 6

Чисто только для справки, но я использую p6spy для регистрации SQL-запросов. Это небольшой промежуточный драйвер jdbc. Точный запрос регистрируется, поскольку он будет отправляться на сервер (с включенными параметрами).

включить его в свой проект:

runtime 'p6spy:p6spy:3.0.0'

Измените свой драйвер источника данных:

driverClassName: com.p6spy.engine.spy.P6SpyDriver

И ваш URL-адрес 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

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

Ответ 7

Я знаю, что это было задано и ответили долго назад. Но мне просто довелось увидеть этот вопрос и не смог остановить себя в ответе или обмене нашим методом внедрения sql logging в нашем проекте. Надеюсь, что это поможет.

В настоящее время он находится в среде разработки. Мы используем "log4jdbc Driver Spy" для регистрации 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/

Король уважает

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

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/