jboss中解决log4j配置冲突
在jboss中使用log4j时,因为jboss本身也使用log4j记录日志,常常会出现应用自己的日志会被记录到jboss的日志文件里或报appenderclosed。这是由于jboss首先加载自己身的log4j文件,后续又加载了应用身的log4j配置文件导致。最终解决方法如下:
配置jboss_server_home/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml文件里的Java2ClassLoadingCompliance及UseJBossWebLoader为false,如果自己的应用里存在WEB-INF/jboss-web.xml,则里面的java2ClassLoadingCompliance及java2ParentDelegaton属性也都设置成false。这样jboss加载webapp将使用JBoss隔离的UCL作为Classloader。
在开发时,偶碰到一个奇怪的问题,简单的webapp加载log4j配置文件测试没有问题,能正常输出日志。但在使用spring的webapp中不会加载log4j.xml或log4j.properties,在web.xml中强行加载log4j配置得以解决,即在web.xml增加以下配置:
<context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/log4j.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
当设置Java2ClassLoadingCompliance及UseJBossWebLoader为false时,会导致webapp有可能找到不在jboss配置的数据库连接池,偶在连接池配置文件中增加了<use-java-context>false</use-java-context>,引用jndi时就不需要加java:。
官方对log4j的配置说明请参考:
jboss官方log4j配置用户手册