不同的服务器对于使用 log4j 是有些不同的,实际使用中主要是用 tomcat 和 jboss 两类:
对于 tomcat, 它本身是没有配置 log4j 的,所以使用起来和常规的一样;
而在 jboss 中它是本身配置了 log4j 的,所以有时候在看项目代码时,其整个项目并没有 log4j 的配置文件,而在一些类中仍然定义了 Logger, 例如 static Logger log = org.apache.log4j.Logger.getLogger(UserDaoImple.class); ,
这就表明开发者使用了 jboss 默认的 log4j 的配置,我们可以在 jboss 下的对应的 log 目录下的 server.log 中看到日志, jboss 本身的 log4j 的配置是将 debug,info 级的日志写在 server.log 中,而像 error 等级别比较高的日志打印到控制台上,而写到 server.log 中的日志比较多,并不方便查看。于是我们想到使用自己的 log4j 配置写到某个具体的文件中(注意文件要先建立,才能往里面写东西, log4j 自己不能建立文件),但这里因为 jboss 有它自己的 log4j 配置,所以如果我们配置的 log4j 包含 Console 的 Appender 时,就会出错,错误类似于 ERROR: invalid console appender config detected, console stream is looping.
解决方法一是不用 Console 的 Appender, 或者改 jboss 的配置文件,在 jboss-service.xml 文件里 , 把
<mbean code="org.jboss.logging.Log4jService" name="jboss.system:type=Log4jService,service=Logging">
<attribute name="ConfigurationURL">resource:log4j.xml</attribute>
<attribute name="CatchSystemOut">false</attribute>
<attribute name="Log4jQuietMode">true</attribute>
</mbean> 。
我建议不用 Console 的 Appender ,当然这是对 jboss3.2.x 是这样,对于 jboss4.0.x 如果我们要用自己的 log4j 配置照上述改还是会有问题,会有类似于 log4j:ERROR A "org.jboss.logging.util.OnlyOnceErrorHandler" object is not assignable to a "org.apache.log4j.spi.ErrorHandler" variable 的异常,解决方法是把 /server/default/jbossweb-tomcat55.sar/META-INF/jboss-service.xml 中的以下两个熟悉改成 true
<attribute name="Java2ClassLoadingCompliance">true</attribute>
<attribute name="UseJBossWebLoader">true</attribute>