Запись операторов Hibernate SELECT в свои собственные файлы журнала - PullRequest
1 голос
/ 21 марта 2019

У нас будет полный UAT в течение следующих двух недель, прежде чем наше приложение Grails 2.4.4 будет запущено.Я хочу регистрировать все операторы SELECT, сгенерированные Hibernate4, которые будут выполнены к тому времени, чтобы я мог разработать правильно оптимизированные индексы базы данных.Существует ли конфигурация в Grails или Tomcat, которая будет записывать SELECT операторов в файл .log, распространяемый в день, аналогично catalina.YYYY-MM-dd.log?Я настроил log4j для регистрации запросов через Config.groovy:

log4j.main = {
    ...
    debug 'org.hibernate.SQL', 'org.codehaus.groovy.grails.orm.hibernate.cfg'
    ...
}

Он регистрирует его на catalina.out.Могу ли я настроить его так, чтобы он добавлялся в другой файл журнала, скажем, hibernate.YYYY-MM-dd.log?Я не против, если параметр будет заменен на ?, это нормально, пока я могу получить оператор SELECT

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Я не могу настроить его на создание отдельных файлов для журналов hibernate.SQL через ответ @ Daniel. Но так как моей команде нужно записывать запросы, начинающиеся завтра, я решил вместо этого просто вручную извлечь необходимые журналы из catalina.out.

Сначала включите запись SQL операторов вашего приложения Grails перед созданием войны

log4j.main = {
    ...
    debug 'org.hibernate.SQL'
    ...
}

Приложение зарегистрирует все операторы SQL в catalina.out, что, кстати, приведет к тому, что файл станет слишком большим. Теперь нам нужно запланировать задачу cron на каждое начало дня, чтобы извлечь операторы предыдущего дня и скомпилировать их в отдельный ежедневный файл.

cat catalina.out | grep "$(date -d "yesterday 13:00" '+%Y-%m-%d').*DEBUG hibernate.SQL" | cut -d " " -f 8- | sort | uniq | sed 's/$/;\n/' > "hibernate.$(date -d "yesterday 13:00" '+%Y-%m-%d').log"

Beakdown скрипта bash выглядит следующим образом:

  1. cat catalina.out Получить исходный файл.
  2. grep "$(date -d "yesterday 13:00" '+%Y-%m-%d').*DEBUG hibernate.SQL" Фильтрация только тех строк, которые начинаются со вчерашней даты (которые вы проходите через эту часть: $(date -d "yesterday 13:00" '+%Y-%m-%d')), и где строка DEBUG hibernate.SQL находится где-то между строкой.
  3. cut -d " " -f 8- Удалить первую часть строки YYYY-MM-dd HH:mm:ss,xxx [http-bio-xxx.xxx.xxx.xxx-xx-exec-x] DEBUG hibernate.SQL -. Наша линия должна немедленно начинаться с SELECT, UPDATE или DELETE.
  4. sort Сортировка строки по алфавиту (необязательно) .
  5. uniq Удалить повторяющиеся строки (необязательно) .
  6. sed 's/$/;\n/' добавьте точку с запятой и новую строку в конце каждой строки.
  7. > "hibernate.$(date -d "yesterday 13:00" '+%Y-%m-%d').log" Сохранить вывод в новый файл hibernate.YYYY-MM-dd.log.

Я предпочитаю не использовать это "хакерское" решение, если бы не срочность, в конце концов, нам нужно решение к завтрашнему дню. Если кто-то все еще может предоставить правильный способ настройки этого с помощью log4j, Grails Config.groovy или Tomcat, будет очень признателен.

0 голосов
/ 21 марта 2019

У меня больше нет приложения Grails 2 для тестирования, но я думаю, что вы можете настроить именованные приложения следующим образом:

log4j = { root ->
  appenders {
    rollingFile name: "sqlLog", file: "target/sql.log" as String
  }
}

, а затем укажите конкретное ведение журнала для указанного аппендера следующим образом:

 debug sqlLog: 'org.hibernate.SQL', 'org.codehaus.groovy.grails.orm.hibernate.cfg'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...