【问题标题】:How to show detail of Exception causes in log files如何在日志文件中显示异常原因的详细信息
【发布时间】:2016-01-21 16:13:05
【问题描述】:

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

【问题讨论】:

    标签: java spring tomcat exception


    【解决方案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));
            }
    
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      另一种选择,使用org.apache.commons.lang3.exception.ExceptionUtils

      ExceptionUtils.getStackTrace(Throwable th) 
      

      给你一个带有整个跟踪的字符串。现在你可以按照你喜欢的方式打印它了

      try{
          //something 
      }catch(Exception exception){
          System.out.println(ExceptionUtils.getStackTrace(exception));
          logger.error("{}", ExceptionUtils.getStackTrace(exception));
      }
      

      【讨论】:

      • 这无济于事,因为我需要从 WebAppContainer 而不是代码来控制它...这就是为什么我要求一种配置 Tomcat 的方法...我试图找出谁忘记了依赖关系,所以我几乎不能要求他们打印他们的异常......而且,异常是在 Bean 构建期间由 Spring 打印的......
      【解决方案3】:

      您可以使用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);
      

      【讨论】:

      • 这无济于事,因为我需要从 WebAppContainer 而不是代码来控制它...这就是为什么我要求一种配置 Tomcat 的方法...我试图找出谁忘记了依赖关系,所以我几乎不能要求他们打印他们的异常......而且,异常是在 Bean 构建期间由 Spring 打印的......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      相关资源
      最近更新 更多