Log4J配置错误 web.xml中关于log4j的设置及范例说明
来源:互联网 发布:863软件孵化培训班 编辑:程序博客网 时间:2024/05/19 14:36
由于懒惰想copy一份工程来做测试用因此当AVerPortal 和AverPortalTest 都在tomcat的编译项目的时候会出现错误
2010-5-14 9:45:40 org.apache.catalina.core.StandardContext listenerStart
严重: Exception sending context initialized event to listener instance of class org.springframework.web.util.Log4jConfigListener
java.lang.IllegalStateException: Web app root system property already set to different value: 'webapp.root' = [F:/JDKandTOMCAT/TOMCAT/Tomcat6.0/webapps/AVerPortal/] instead of [F:/JDKandTOMCAT/TOMCAT/Tomcat 6.0/webapps/AVerPortalTest/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
原因是当在web.xml中没指定
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>AVerPortalTest</param-value>
</context-param>
的时候按照默认的
做法1
在tomcatserver启动项目目录删除AVerPortal 和AverPortalTest 其中一个
做法2
在web.XML中添加webAppRootKey指定好
在web.xml有几个条目和log4j有关,它们是:
<context-param> <param-name>webAppRootKey</param-name> <param-value>petclinic.root</param-value></context-param><context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INFclasseslog4j.properties</param-value></context-param>(该条目在petclinic中被注释掉了)<listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener>
我们知道,在web-application中使用log4j,有很多配置方式:
a.
用servlet或者ServletContextListener对log4j做配置。通常,你不需要亲自编写servlet或者 listener,比如直接利用log4j的com.apache.jakarta.log4j.Log4jInit类,Spring的 org.springframework.web.util.Log4jConfigServlet和 org.springframework.web.util.Se
rvletContextListener,这种方式配置灵活,可以通过参数条目自行指定log4j.properties的位置。
b.
把log4j 的默认配置文件(log4j.properties)放在classpath中,通常是/web-inf/classes目录下.这种方式是log4j的 默认配置方式,无须其他配置。缺点就是无法灵活的通过配置文件来指定log4j.properties的文件位置。在我们的petclinic项目中,因 为listener条目被注释,所以采用的也是这种缺省方式。
现在我们考虑listener条目没有被注释的情况,这种情况和注册Log4jConfigServlet的目的是一样的,只是必须在支持listener的servlet container中使用。
找到.Log4jConfigServlet和ServletContextListener的源码,他们都在适当的地方 (callback method)调用了Log4jWebConfigurer.initLogging(getServletContext()); 定位到这个方法,第一句就是:WebUtils.setWebAppRootSystemProperty(servletContext);再定位到该 方法,方法很短:
public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException { String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM); String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY); String oldValue = System.getProperty(key); if (oldValue != null) { throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " + oldValue + " - Choose unique webAppRootKey values in your web.xml files!"); } String root = servletContext.getRealPath("/"); if (root == null) { throw new IllegalStateException("Cannot set web app root system property when WAR file is not expanded"); } System.setProperty(key, root); servletContext.log("Set web app root system property: " + key + " = " + root);}
从代码看出,该方法其实就是把该web application的根目录的绝对文件路径作为属性保存在 System的属性列表中。该属性的名字,由web.xml文件中的名为"webAppRootKey"的参数值指出。如果不在web.xml中定义 webAppRootKey参数,那么属性名就是缺省的"webapp.root".在我们的petclinic项目中已经定义了 webAppRootKey参数,其值为"petclinic.root",因此,属性的名字就是"petclinic.root".
再回到Log4jWebConfigurer.initLogging(getServletContext()),接下来的行为是从web.xml中获取 log4jConfigLocation和log4jRefreshInterval.前者指出log4j配置文件(有可能是xml格式)的位置和名字, 后者则指出重新都取配置文件的时间间隔.然后调用Log4jConfigurer.initLogging()方法对log4j做配置。从 Log4jConfigurer.initLogging()方法我们可以看到,针对不同格式的配置文件(properties或者xml), Log4jConfigurer采用不同的lo4j configurator类做配置,例如DOMConfigurator或者 PropertyConfigurator。
至此,关于petclinic中关于log4j的配置,我们已经基本上弄清楚了。可是System对象中的
petclinic.root属性在什么时候使用呢?在web-inf/classes下面的log4j.properties文件中,有这么一句:
log4j.appender.logfile.File=${petclinic.root}/WEB-INF/petclinic.log
这样,我们就用上了petclinic.root属性了。从上面的分析可知,如果你不在web.xml中定义webAppRootKey参数,那么你就得把 log4j.appender.logfile.File=${petclinic.root}/WEB-INF/petclinic.log中的petclinic.root变量改为webapp.root变量或者干脆换成别的绝对路径了。
- Log4J配置错误 web.xml中关于log4j的设置及范例说明
- web.xml中关于log4j的设置及范例说明
- web.xml中关于log4j的设置及范例说明
- web.xml中关于log4j的设置及范例说明
- web.xml中关于log4j的设置及范例说明
- web.xml中关于log4j的设置及范例说明 以及关于webapp.root
- LOG4J的配置范例
- LOG4J的配置范例
- web.xml log4j的配置
- log4j.properties的配置及对应web.xml中的配置
- Log4J配置错误 - 关于webapp.root的设置
- 深入浅析java web log4j 配置及在web项目中配置Log4j的技巧
- 深入浅析java web log4j 配置及在web项目中配置Log4j的技巧
- Android中使用Log4j及配置说明
- Android中使用Log4j及配置说明
- log4J 日志信息log4j.xml配置说明
- web.xml文件中引用log4J的配置以及log4J文件配置
- log4j在web.xml中如何配置
- lnmp安装配置
- IE异步可插入协议扩展应用
- 建议给初学
- IIS7下伪静态(URL重写)的实现方法
- 利用Axis2开发WebService(4)---用wsdl2java简化客户端的编写
- Log4J配置错误 web.xml中关于log4j的设置及范例说明
- Android中Activity之间传递参数
- 阻止浏览器冒泡事件,兼容firefox和ie
- 乱码问题
- OFFICE2007中一种简单插入目录的方法总结
- C++关于空指针
- 类成员函数的重载、覆盖和隐藏区别?
- java减少数据访问层代码—反射2—数据访问层Wrapper—更新数据源码
- 利用Axis2开发WebService(5)---使用services.xml文件发布WebService