排查tomcat发包重启失败问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunyuhua_keyboard/article/details/86220650

重启tomcat重新发布war包,日志打印如下错误

信息: Deploying web application archive integration.war
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
一月 09, 2019 6:28:37 下午 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
一月 09, 2019 6:28:37 下午 org.apache.catalina.core.StandardContext start
严重: Context [/integration] startup failed due to previous errors

但是以上打印的日志信息太简单,不能排查问题,需要tomcat能打印更详尽的日志,
方法如下:
1、找到tomcat下需要打印日志的项目的/WEB-INF/classes下
2、创建一个叫做logging.properties的文件,文件内容如下:

handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory =/home/tomcat/tomcat6/9403_common/logs
org.apache.juli.FileHandler.prefix = error-debug
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

/home/tomcat/tomcat6/9403_common/logs 为自己的logs目录地址
3、重启tomcat查看tomcat下logs的一个叫做error-debug开头的日志

我项目打印出来的日志是

INFO: Initializing Spring root WebApplicationContext
Jan 10, 2019 10:23:34 AM org.apache.catalina.core.StandardContext listenerStart
SEVERE: 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' = [/home/tomcat/tomcat6/9403_common/webapps/common/] instead of [/home/tomcat/tomcat6/9403_common/webapps/integration/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
	at org.springframework.web.util.WebUtils.setWebAppRootSystemProperty(WebUtils.java:162)
	at org.springframework.web.util.Log4jWebConfigurer.initLogging(Log4jWebConfigurer.java:119)
	at org.springframework.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:49)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4236)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4739)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:803)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:780)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:583)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:944)
	at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:779)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:505)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1322)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:325)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1069)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:822)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
	at org.apache.catalina.core.StandardService.start(StandardService.java:525)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:759)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

Jan 10, 2019 10:23:34 AM org.apache.catalina.core.ApplicationContext log

下面说一下此问题的思路:

1、产生错误的原因

在web.xml中如果不显式的配置参数webAppRootKey,默认值为webapp.root,在项目中可以通过以下代码,来动态获项目的运行路径。

System.getProperty("webapp.root")

而部署在同一个容器中的项目,要配置不同的webAppRootKey,否则在启动容器时,就会发生冲突,报2中的错误。

另外,如果在web.xml中配置 org.springframework.web.util.Log4jConfigListener这个监听器,它也包含了WebAppRootListener的功能。所以当在同一容器中部署多个项目时,要显式的声明不同的webAppRootKey。

在这里插入图片描述

而我们正式一个tomcat下放置了多个项目,并且配置了org.springframework.web.util.Log4jConfigListener,这样就会产生错误。

2、修改问题的办法
在web.xml中增加不同webAppRootKey配置
一个修改为

<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>integration.root</param-value>
</context-param>

另一个修改为

  <context-param>
                <param-name>webAppRootKey</param-name>
                <param-value>webapp.root</param-value>
 </context-param>

3、重启tomcat,问题修复完成

猜你喜欢

转载自blog.csdn.net/sunyuhua_keyboard/article/details/86220650