如何阻止Tomcat在Servlet启动失败后返回404而非含堆栈跟踪的500错误?
如何阻止Tomcat在Servlet启动失败后返回404而非含堆栈跟踪的500错误?
这个问题我之前调试Tomcat 10的时候也踩过坑!默认机制真的挺反人类的——第一次Servlet启动失败(比如API版本不兼容、类文件版本太高这类启动级错误),Tomcat就直接把整个WAR包标记为禁用,后面再访问直接返回404,连半点错误提示都没有,排查问题简直要挠头。
不过别担心,改两个配置就能解决,分两种场景给你说:
单个应用生效(推荐,不影响其他应用)
打开你WAR包的META-INF目录,创建或修改context.xml文件,在<Context>标签里加上failCtxIfServletStartFails="false"属性,示例代码如下:<Context failCtxIfServletStartFails="false"> <!-- 这里可以保留你原本的其他配置项 --> </Context>原理很简单:默认这个属性是
true,意思是Servlet启动失败就直接让整个上下文(应用)不可用;设为false之后,上下文会保持可用状态,每次请求那个有问题的Servlet时,Tomcat都会尝试重新初始化它,这时候就会返回500错误,还会带上完整的堆栈跟踪信息,调试起来直接看响应里的错误就行,不用再反复重启部署了!全局所有应用生效
如果你想让服务器上所有应用都用这个规则,就去Tomcat安装目录下的conf文件夹,修改context.xml文件,同样在<Context>标签里添加failCtxIfServletStartFails="false"属性,和上面的代码示例一样。
另外提一句,要是你还想在Tomcat启动日志里也看到启动失败的堆栈,确保catalina.out或者localhost.log的日志级别是INFO及以上就行,不过上面的配置已经能帮你在请求时直接拿到错误信息,调试效率提升不少。
内容来源于stack exchange




