我有来自Tomcat的日志文件,显示以下错误:
Caused by: java.lang.ClassNotFoundException: com.package.MyClass
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1858)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1709)
... 33 more
Stacktrace的上半部分(在原因之前删除了所有内容,因为它没有显示我需要的信息)只显示Spring内部类。但是,出现此错误的原因是有人忘记报告war文件的传递依赖...
有没有办法 配置Tomcat 来显示隐藏的堆栈跟踪行?
注意:exception.getCause().printStacktrace()
不是我想要的,我想要详细打印所有的堆栈跟踪。
答案 0 :(得分:1)
不知道如何在Tomcat中配置它,但是,如果在初始化Spring Servlet时出现错误,您可以扩展它并手动打印异常:
public class StartupErrorSafeDispatcherServlet extends DispatcherServlet {
private Logger logger = ...
@Override
public void init(ServletConfig config) throws ServletException {
try {
super.init(config);
} catch (Throwable t) {
System.out.println(ExceptionUtils.getStackTrace(t));
logger.error("{}", ExceptionUtils.getStackTrace(t));
}
}
}
答案 1 :(得分:0)
您可以使用Guava library which provides a method getStackTraceAsString:
返回一个包含toString()结果的字符串,后跟 完整的,递归的堆栈跟踪的throwable。请注意,你可能 不应该解析结果字符串;如果你需要程序化的 访问堆栈帧,可以调用Throwable.getStackTrace()。
您还可以考虑查看Package java.util.logging之类的内容
Logger logger = Logger.getAnonymousLogger();
Exception e1 = new Exception();
Exception e2 = new Exception(e1);
logger.log(Level.SEVERE, "Exception", e2);
答案 2 :(得分:0)
另一种方法是使用org.apache.commons.lang3.exception.ExceptionUtils
:
ExceptionUtils.getStackTrace(Throwable th)
为您提供一个包含整个跟踪的String。现在您可以按照自己喜欢的方式打印
try{
//something
}catch(Exception exception){
System.out.println(ExceptionUtils.getStackTrace(exception));
logger.error("{}", ExceptionUtils.getStackTrace(exception));
}