我编写了一个自定义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启动时是可见的?

有帮助吗?

解决方案

我认为你可以在服务器/ [jboss-configuration] / lib中部署Solr库(在JBoss 4中,在新版本中可能是相同的),然后它们在启动时可用。

或者不要使用JBoss log4j配置并在WAR中定义自己的log4j.xml(在lib或类中的JAR中)。它在部署时将由应用程序类加载器加载。

其他提示

正如您所发现的那样,您必须将JAR放入JBoss配置的 lib 目录中,以便在 jboss-log4j.xml中引用其类型 ,但这通常不是好的做法。

一个非常直接的选择是从应用程序内部以编程方式调用log4j API。如果你有一个WAR,那么定义一个 ServetContextListener (或类似的东西),它在WAR部署时调用,并附加你的appender。同样,当取消部署时,它会分离appender。

请参阅上一个问题的答案,了解如何获取开始这样做了。

我猜这是为了管理你的日志文件并使它们更容易搜索,一个splunk ????然而,这感觉就像是一种相当古怪的做法。有点“看,我可以让狗在它的后腿上行走”。有点事......很酷,但你为什么要这样?

我认为更简单,更强大的方法是a)抓住Splunk免费版! b)有一个单独的进程,它从磁盘使用你的日志文件,并使用Solr4J将它们发送到Solr。

我认为要求Solr,只是做日志记录会增加很大的复杂性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top