#grails #log4j #perf4j
#grails #log4j #perf4j
Вопрос:
Я использую Grails 1.3.7. Я создаю файл war и развертываю его в tomcat. У меня есть внешний файл конфигурации groovy, который я использую для настройки ведения журнала. Я добавил некоторые приложения для ведения журнала perf4j к объявлению, но теперь файл конфигурации не может скомпилироваться, потому что он не может разрешить полные имена классов.
Код выглядит следующим образом:
log4j = {
...
// file appender that writes out the URLs of the Google Chart API graphs generated by the performanceGraphAppender
def performanceGraphFileAppender = new org.apache.log4j.FileAppender(
fileName: "log/perfGraphs.log",
layout: pattern(conversionPattern: '%m%n')
)
appender name: 'performanceGraphFileAppender', performanceGraphFileAppender
// this appender creates the Google Chart API graphs
def performanceGraphAppender = new org.perf4j.log4j.GraphingStatisticsAppender(
graphType: 'Mean', // possible options: Mean, Min, Max, StdDev, Count or TPS
tagNamesToGraph: 'tag1,tag2,tag3',
dataPointsPerGraph: 5
)
performanceGraphAppender.addAppender(performanceGraphFileAppender)
appender name: 'performanceGraph', performanceGraphAppender
...
}
и сообщение об ошибке, которое записывается в журнал, выглядит следующим образом:
script1317679813518843914255.groovy: 38: unable to resolve class org.perf4j.log4j.GraphingStatisticsAppender
@ line 38, column 34.
def performanceGraphAppender = new org.perf4j.log4j.GraphingStatisticsAppender(
Файл war, который я создаю, содержит все необходимые JAR. Есть мысли о том, как заставить его разрешить ссылки?
Спасибо,
Gene
Ответ №1:
Существует вероятность того, что после развертывания он начнет использовать log4j из tomcat. Взгляните на lib
папку, возможно, она содержит банки log4j. Если это правда — он использует другой загрузчик классов, который не может видеть ваши классы perf4j.
Вы можете попробовать поместить свои банки perf4j в tomcat lib
, возможно, это может решить эту проблему
Комментарии:
1. Это интересно. Я попробую. Однако мне интересно, как это работает: среда выполнения grails находится в том же файле WAR, что и файлы perf4j. Почему он не найдет их? Чего мне не хватает?
2. Когда я поместил банки perf4j и log4j в папку tomcat / lib, код, казалось, выполнялся правильно. Интересно, почему он не выбирает классы из файла application WAR.
3. это проблема разных загрузчиков классов. Похоже, что у tomcat были классы log4j где-то еще, а не только ваша война (поскольку log4j используется большинством проектов), и JVM заявила, что использует его (= из другого загрузчика классов). В то же время per4j был только в вашей войне, но загрузчик классов, содержащий log4j (= соседний загрузчик классов), не имеет доступа к вашим библиотекам.
4. До того, как я поместил log4j в папку lib, он также не разрешал классы log4j, упомянутые в моем файле logging.groovy. Так что для меня это все еще загадка.