Я хочу войти в консоль или в файл, все запросы, которые делает Grails, для проверки производительности.
Я сконфигурировал этот без успеха.
Любая идея поможет.
Я хочу войти в консоль или в файл, все запросы, которые делает Grails, для проверки производительности.
Я сконфигурировал этот без успеха.
Любая идея поможет.
настройка
datasource {
...
logSql = true
}
в DataSource.groovy (согласно этим инструкциям) было достаточно, чтобы заставить его работать в моей среде. Похоже, что части часто задаваемых вопросов устарели (например, вопрос "многие ко многим столбцам назад"), поэтому это может также быть тем, что изменилось в то же время.
Я считаю более полезным сделать следующее: включить ведение журнала 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. *
Вариант №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
Попробуйте следующее:
log4j = {
...
debug 'org.hibernate.SQL'
trace 'org.hibernate.type.descriptor.sql.BasicBinder'
}
Это позволяет избежать проблем с производительностью трассировки протокола Hibernate type
. Это работает с Hibernate 3.6 и выше. Я получил это от: https://burtbeckwith.com/blog/?p=1604
Решение предназначено только для разработки, а не для производства.
Все ответы выше работают и верны. Но они не показывают полный запрос в удобном для человека виде. Если вы хотите увидеть окончательный (без каких-либо?,?) Запрос, у вас есть два варианта.
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
Чисто только для справки, но я использую 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
Не забудьте отключить это для производства!
Я знаю, что это было задано и ответили долго назад. Но мне просто довелось увидеть этот вопрос и не смог остановить себя в ответе или обмене нашим методом внедрения 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/
Король уважает
Для конкретного блока кода мы также можем создать метод, который принимает замыкание. например.
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")}
Если у вас установлен консольный плагин, вы можете получить регистрацию 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 только для тестов в этом одном файле.
Следующие работы для меня:
# ...
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:...
# ...
// ...
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
// ...