Tomcat跟Jboss有个很重要的区别,Jboss是会把$JBOSS_HOME/server/all/deploy/project.war包含在CLASSPATH里,而Tomcat不会,只有$PROJECT.WAR/WEB-INF/classes里。因此java代码ClassA.class.getResourceAsStream(“WEB-INF/a.properties”)没法读取到文件,由于classpath没包含此项目主目录。对应log4j,就是不要在project.war放log4j.properties/log4j.xml来配置log4J,而应该在project.war/WEB-INF/classes下。Java代码读取这里的代码能够加.到JVM启动shell的classpath,或者用Listener来设置变量表示应用主目录:以下是spring的一个Listener能够配置系统变量projeta.root, java代码能够在web应用中(必须在web应用中,若是非web应用,能够容易的加classpath来解决)用System.getProperty(“projecta.root”)来读取应用的物理主目录:
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>projecta.root</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.util.WebAppRootListener
</listener-class>
</listener>
Tomcat内建的是jdk的logging来跟踪日志,配置在$TOMCAT_HOME/conf/logging.properties.
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers=1catalina.org.apache.juli.FileHandler
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/projecta].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers=1catalina.org.apache.juli.FileHandler
tomcat-juli.jar,tomcat-juli-adapters.jar(extras)
tomcat-juli.jar to override tomcat.home/bin.
tomcat-juli-adapters.jar to tomcat.home/lib.
log4j to tomcat.home/lib
log4j.properties/log4j.xml to tomcat.home/lib
mv conf/logging.properties conf/logging.properties.bak
若是只是某个web application须要用log4j而tomcat自己还延用JDK logging的话,只须要log4j/common-logging/log4j配置在CLASSPATH里能找到便可实现。若是log4j配置不止一个,会层叠效果,若是重复项,会后者覆盖前者(classpath顺序而定)。