Log4j作为日志组件被大多数的系统所使用,Jboss也不例外的采用了Log4j作为它的日志输出组件。
但在使用JBoss时,很多人经常碰到一些冲突,这些冲如自己配置的log4j文件无效,系统抛org.jboss.logging.util.OnlyOnceErrorHandlerobject is not assignable to a or
g.apache.log4j.spi.ErrorHandler variable异常等。为了解决造成这方面的原因,我们需要分析Jboss和log4j的一些关系。本文的下面内提供了一个最佳的配置及对问题的分析,在理解了下面的内容后,相信大家都能解决log4j的冲突问题,并找到符合自己的一种解决方法。
一、最佳无冲突配置
解决jboss和log4j冲突的最理想配置如下:
配置jboss_server_home/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml文件里的Java2ClassLoadingCompliance及UseJBossWebLoader为false,如果存在WEB-INF/jboss-web.xml,则里面的java2ClassLoadingCompliance及java2ParentDelegaton属性也都设置成false。在webapp里log4j的配置文件采用xml形式,并命名为log4j.xml,同时在webapp的lib里需要包含log4j相关的jar包,通过这样的配置后,webapp的log4j和jboss的log4j将相互隔离互不影响。
二、Log4j载入配置文件的方式
Log4j在查找它的配置文件的时候,默认情况下,首先会在Classloader里查找log4j.xml文件,第一个找到的文件作为它的配置,在找不到log4j.xml文件的情况下,再查找log4j.properties文件,找到则使用这个文件,没有找到则报错。
三、JBoss和Log4j的关系:
关于JBoss启动和ClassLoader模型的关系,请参见:
http://blog.csdn.net/youfly/archive/2009/02/12/3884081.aspx
为了更好的理解下面的内容,如果对JBoss的启动过程和ClassLoader模型不太清楚的话,请先阅读上面的文章。
下图是jbossclassloader和相关的log4j配置文件
Jboss classloader及相关的log4j的配置文件
四、JBoss