如何在日志文件中显示异常原因的详细信息

时间:2015-10-22 11:36:27

标签: java spring tomcat exception

我有来自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()不是我想要的,我想要详细打印所有的堆栈跟踪。

3 个答案:

答案 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));
}