Протоколирование инструкций выбора режима гибернации в их собственные файлы журналов

#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 выглядит следующим образом:

  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, мы будем действительно признательны.