Frage

Ich habe einen benutzerdefinierten log4j Appender geschrieben, die ein neues Solr Dokument für jeden Protokolleintrag erstellt und ich habe Probleme, es zu JBoss bereitstellen.

Die Quelle ist sichtbar auf Github aber das eigentliche Problem versucht, die appender von JBoss zu verwenden.

Die relevent Bits von Jboss-log4j.xml wie folgt aussehen:

<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>

Die Abhängigkeiten für Solr sind alle in der WAR-Datei, die geliefert wird, aber ich vermute, dass, wenn die appender ganz im Boot-Prozess frühzeitig initialisiert hat, dass die Anwendung noch nicht eingesetzt worden, weshalb ich ist sehe diesen Fehler im Protokoll:

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

Gibt es eine Möglichkeit, die Initialisierung bis zum solr App verzögern wurde eingesetzt, oder gibt es eine Möglichkeit, die Solr App zu implementieren, so dass es Bibliotheken ist sichtbar sind zu jboss, während es bootet?

War es hilfreich?

Lösung

Ich glaube, Sie könnten entweder die Solr Libs in Server / [jboss-Konfiguration] / lib bereitstellen (in JBoss 4, das heißt, könnte das gleiche in neueren Versionen sein), dann sind sie beim Booten zur Verfügung.

oder benutzen Sie nicht die JBoss log4j Konfiguration und definieren Sie Ihre eigenen log4j.xml in Ihrem IST (entweder in einer JAR in lib oder in Klassen). Es wird durch die Anwendung geladen werden, wenn Classloader es eingesetzt wird.

Andere Tipps

Wie Sie entdeckt haben, würden Sie Ihre JAR in die JBoss config lib Verzeichnis, um ihre Typen in jboss-log4j.xml beziehen setzen müssen, aber dies ist in der Regel keine gute Praxis.

Eine hübsche straightward Alternative ist, die log4j API programmatisch von innen Ihre Anwendung aufzurufen. Wenn Sie eine WAR haben, definieren dann eine ServetContextListener (oder so ähnlich), die aufgerufen wird, wenn der Krieg einsetzt und die Befestigung Ihrer appender. Ebenso, wenn nicht entfalteten, es löst die appender.

Sehen Sie die Antwort auf diese vorherige Frage , wie man tun dies gestartet.

Ich vermute, dass dies Ihre Log-Dateien zu verwalten und machen sie leichter zu suchen, a la Splunk ???? Allerdings ist dies wie eine ziemlich seltsame Art und Weise fühlt, dies zu tun .. Art der „aussehen, kann ich einen Hund machen geht auf sie Hinterbeine ist“ Art der Sache ... Cool, aber warum sollte man das wollen?

Ich denke, ein viel einfacherer, robusteren Ansatz zu a) ist greifen Splunk Free Edition! b) haben einen separaten Prozess, der Ihre Log-Dateien von der Festplatte verbraucht und senden Sie sie an Solr Solr4J verwenden.

Ich denke, erfordert Solr, nur die Protokollierung zu tun einen großen Grad an Komplexität hinzu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top