Мы используем p6spy 3.9.0 для регистрации всех SQL операторов, выполняемых в нашем приложении Grails 2.4.4. Во время разработки мы используем отдельный файл spy.properties
внутри каталога grails-app/conf/
, как показано ниже:
# <app dir>\grails-app\conf\spy.properties
append = true
appender = com.p6spy.engine.spy.appender.FileLogger
autoflush = true
customLogMessageFormat = %(sqlSingleLine)
databaseDialectDateFormat = yyyy-MM-dd
driverlist = oracle.jdbc.driver.OracleDriver
logfile = logs\\sql.log
logMessageFormat = com.p6spy.engine.spy.appender.CustomLineFormat
Мы развертываем его на сервере Tomcat. На сервере другой файловый каталог по сравнению с нашим приложением для разработки. Чтобы учесть разницу, мы удалили файл spy.properties
и вместо этого поместили его в файл Config.groovy
, фрагмент, как показано ниже:
// <app dir>\grails-app\conf\Config.groovy
p6spy {
config {
append = true
appender = com.p6spy.engine.spy.appender.FileLogger
autoflush = true
customLogMessageFormat = "%(sqlSingleLine)"
databaseDialectDateFormat = "yyyy-MM-dd"
driverlist = oracle.jdbc.driver.OracleDriver
logfile = ".." + File.separator + "logs" + File.separator + "sql.log"
logMessageFormat = com.p6spy.engine.spy.appender.CustomLineFormat
}
}
environments {
development {
logfile = "logs" + File.separator + "sql.log"
}
production {
logfile = ".." + File.separator + "logs" + File.separator + "sql.log"
}
}
Однако это не работает.
Когда мы запускаем разрабатываемое приложение, оно создает файл журнала в каталоге приложения - вместо создания файла <app dir>\logs\sql.log
, как указано в файле Config.groovy
, он создает его в <app dir>\sql.log
и запускает приложение.
Когда мы генерируем файл war
и помещаем его в производство, Tomcat Server даже не запускается и вместо этого выдает следующую ошибку:
org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем «transactionManagerPostProcessor»: инициализация bean-компонента не удалась; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем «transactionManager»: невозможно разрешить ссылку на bean-компонент «sessionFactory» при установке свойства bean-компонента «sessionFactory»; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем 'sessionFactory': не удается разрешить ссылку на bean-компонент 'hibernateProperties' при установке свойства bean-компонента 'hibernateProperties'; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'hibernateProperties': не удается разрешить ссылку на bean-компонент 'dialectDetector' при установке свойства bean-компонента с помощью ключа [hibernate.dialect]; вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем 'dialectDetector': не удалось вызвать метод инициализации; вложенное исключение: org.springframework.jdb c .support.MetaDataAccessException: Ошибка при извлечении DatabaseMetaData; вложенное исключение - org. apache .tomcat.dbcp.dbcp.SQLNestedException: невозможно создать PoolableConnectionFactory (невозможно найти драйвер, который принимает jdbc:oracle:thin:@localhost: 1521: ORCL)
Эта ошибка отображается, когда нет Конфигурация p6spy определяется при запуске приложения. Эта ошибка может проявляться как при разработке, так и при производстве, если JVM не обнаруживает конфигурацию p6spy. Как ни странно, означает ли это, что JVM может читать конфигурацию p6spy в файле Config.groovy
при запуске в процессе разработки, а не при развертывании на сервере Tomcat? Но если он действительно может прочитать конфигурацию p6spy при запуске в разработке, почему он не создает файл внутри каталога, указанного свойством logfile
?
В качестве временного исправления мы восстановили <app dir>\grails-app\conf\spy.properties
file и меняем значение свойства logfile
каждый раз, когда мы создаем war
, и возвращаем его к предыдущему значению каждый раз, когда мы запускаем его в разработке. Есть ли способ удалить spy.properties
и просто вставить его в Config.groovy
? Или есть способ настроить приложение так, чтобы оно имело две версии файла spy.properties
и загружало разные версии в зависимости от среды?