我编写了一个自定义log4j appender,它为每个日志条目创建一个新的Solr文档,我在将其部署到JBoss时遇到了问题。
可以在github上查看源代码,但真正的问题是尝试使用JBoss的appender。
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启动时是可见的?
答案 0 :(得分:3)
我认为您可以在server / [jboss-configuration] / lib中部署Solr库(在JBoss 4中,在新版本中可能相同),然后它们在启动时可用。
或者不要使用JBoss log4j配置并在WAR中定义自己的log4j.xml(在lib或类中的JAR中)。它在部署时将由应用程序类加载器加载。
答案 1 :(得分:1)
正如您所发现的那样,您必须将JAR放入JBoss配置的lib
目录中,以便在jboss-log4j.xml
中引用它的类型,但这通常不是一种好的做法。 / p>
一个非常直接的选择是从应用程序内部以编程方式调用log4j API。如果你有一个WAR,那么定义一个ServetContextListener
(或类似的东西),它在WAR部署时调用,并附加你的appender。同样,当取消部署时,它会分离appender。
请参阅this previous question的答案,了解如何开始这样做。
答案 2 :(得分:0)
我猜这是为了管理你的日志文件并使它们更容易搜索,一个splunk ????然而,这感觉就像一个相当古怪的做法。有点“看,我可以让狗在它的后腿上行走”这样的事情......很酷,但你为什么要这样?
我认为更简单,更强大的方法是a)抓住Splunk免费版! b)有一个单独的进程,它从磁盘使用你的日志文件,并使用Solr4J将它们发送到Solr。
我认为要求Solr,只是做日志记录会增加很大的复杂性。