#hibernate #grails #log4j
#переход в режим гибернации #grails #log4j
Вопрос:
В течение следующих двух недель, прежде чем наше приложение Grails 2.4.4 начнет функционировать, у нас будет полный UAT. Я хочу протоколировать все 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
инструкцию
Ответ №1:
У меня больше нет приложения 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'
Ответ №2:
Я не могу настроить его на создание отдельных файлов для hibernate.SQL
журналов через ответ @Daniel’s. Но поскольку моей команде необходимо записывать запросы, начиная с завтрашнего дня, я решил просто вручную извлечь необходимые журналы из catalina.out
вместо этого.
Во-первых, включите протоколирование SQL
инструкций вашего приложения Grails перед созданием war
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"
Завершение работы скрипта bash выглядит следующим образом:
cat catalina.out
Извлеките исходный файл.grep "$(date -d "yesterday 13:00" ' %Y-%m-%d').*DEBUG hibernate.SQL"
Фильтруйте только строки, которые начинаются со вчерашней даты (которую вы получаете через эту часть:$(date -d "yesterday 13:00" ' %Y-%m-%d')
) и в которых строкаDEBUG hibernate.SQL
находится где-то посередине между строками.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
.sort
Сортирует строку по алфавиту (необязательно).uniq
Удалите повторяющиеся строки (необязательно).sed 's/$/;n/'
добавляйте точку с запятой и новую строку в конце каждой строки.> "hibernate.$(date -d "yesterday 13:00" ' %Y-%m-%d').log"
Сохраните выходные данные в новый файлhibernate.YYYY-MM-dd.log
.
Я предпочитаю не использовать это «хакерское» решение, если бы не срочность, в конце концов, нам нужно решение к завтрашнему дню. Если кто-то все еще может предоставить правильный способ настройки этого с помощью log4j
Grails Config.groovy
или Tomcat, мы будем действительно признательны.