Что я должен делать с пользовательскими зависимостями App4 Log4j

StackOverflow https://stackoverflow.com/questions/1815222

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top