Что я должен делать с пользовательскими зависимостями App4 Log4j
Вопрос
Я написал собственный app4 log4j, который создает новый документ Solr для каждой записи в журнале, и у меня возникают проблемы с его развертыванием в JBoss.
Источник доступен для просмотра на github , но настоящая проблема заключается в попытке использовать приложение из JBoss. р>
Отдельные биты jboss-log4j.xml выглядят так:
<appender name="SOLR" class="com.stuartgrimshaw.solrIndexAppender.SolrIndexAppender" />
<root>
<priority value="${jboss.server.log.threshold}"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="SOLR"/>
</root>
Все зависимости для Solr доступны в поставляемом файле .war, но я предполагаю, что, когда appender инициализируется довольно рано в процессе загрузки, это приложение еще не было развернуто, поэтому я увидеть эту ошибку в журнале:
2009-11-29 10:40:57,715 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Create: name=jboss.system:service=Logging,type=Log4jService state=Configured mode=Manual requiredState=Create
java.lang.NoClassDefFoundError: org/apache/solr/client/solrj/SolrServerException
Можно ли как-нибудь отложить инициализацию до развертывания приложения solr, или есть способ развернуть приложение Solr, чтобы его библиотеки были видны jboss во время загрузки?
Решение
Я думаю, что вы можете либо развернуть библиотеки Solr в server / [jboss-configuration] / lib (в JBoss 4, то есть могут быть такими же в более новых версиях), тогда они будут доступны во время загрузки.
Или не используйте конфигурацию JBoss log4j и определите свой собственный log4j.xml в вашей WAR (либо в JAR в lib, либо в классах). Он будет загружен загрузчиком классов приложения при его развертывании.
Другие советы
Как вы обнаружили, вам нужно поместить JAR-файл в каталог lib
конфигурации JBoss, чтобы ссылаться на его типы в jboss-log4j.xml
, но это, как правило, не очень хорошая практика.
Довольно простой альтернативой является программный вызов API log4j изнутри вашего приложения. Если у вас есть WAR, тогда определите ServetContextListener
(или что-то подобное), который вызывается при развертывании WAR и который присоединяет вашего аппендера. Точно так же, когда он не развернут, он отсоединяет приложение.
См. ответ на этот предыдущий вопрос , чтобы узнать, как получить начал делать это.
Я предполагаю, что это для управления файлами журналов и облегчения их поиска, а-ля Splunk ???? Тем не менее, это выглядит как довольно странный способ сделать это ... своего рода "взгляд", я могу заставить собаку ходить на задних лапах ". такие вещи ... Круто, но зачем тебе это?
Я думаю, что гораздо более простой и надежный подход заключается в том, чтобы: a) получить бесплатную версию Splunk! б) иметь отдельный процесс, который использует ваши файлы журналов с диска и отправляет их в Solr с помощью Solr4J. Р>
Я думаю, что требуется Solr, просто ведение журнала добавляет огромный уровень сложности.