【问题标题】:Quarkus: Include stacktraces with unhandled exceptionsQuarkus:包含未处理异常的堆栈跟踪
【发布时间】:2021-05-12 23:22:35
【问题描述】:

我是 quarkus/resteasy 的新手,但是当我在本地以开发模式运行我的 quarkus 应用程序时,未处理的异常包括有用的详细信息和堆栈跟踪,如下所示:

{ 
  "details": "Error handling b4f19eef-3634-49f4-865e-55ee75ee3f82-1, org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException: bla bla bla...",
  "stack": "org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException: Cannot invoke ... 
            ... mile long stack trace here ..."
}

但是,从服务器运行时,我收到了这些精简的错误消息,如下所示:

{
  "details": "Error id e7bdec12-e36c-40fe-a7c6-096ec8eb62ca-4",
  "stack": ""
}

我如何才能像从服务器本地获取异常消息一样获取异常消息?是什么导致了这种变化?我找不到任何可能与此相关的application.properties (https://quarkus.io/guides/all-config),而且我不知道还能去哪里找。

【问题讨论】:

    标签: java exception resteasy quarkus


    【解决方案1】:

    正如 Geoand 所提到的,您真的不想在本地开发环境之外的任何其他环境上执行此操作。但是 JaxRS(由 Resteasy 实现)让您完全控制,您可以创建自定义 JaxRS 异常映射器以将未处理的异常转换为您想要的任何 HTTP 响应,包括堆栈跟踪的所有血腥细节。示例:

    @Provider
    @Priority(10000)
    //the more generic the mapper, the lower its prio should be(the lower the number the higher the pri), so you can override it with more specific mappers
    public class ChattyExceptionMapper implements ExceptionMapper<Exception> {
    
        @Context
        HttpHeaders headers;
        //you can inject all JaxRS ctx data using @Context, see spec
        @Context
        ResourceInfo resourceInfo;
    
        @Override
        public Response toResponse(Exception e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            return Response
                    .serverError()
                    .entity(Map.of(
                            "requestHeaders", headers.getRequestHeaders(),
                            "endpointClass", resourceInfo.getResourceClass(),
                            "endpointMethod", resourceInfo.getResourceMethod().getName(),
                            "stacktrace", sw.toString()))
                    .build();
        }
    }
    

    我在 prod 中更有用的方法可能是,您在后台将堆栈跟踪/错误信息报告给一些错误报告系统(例如 Sentry,...),为该事件分配一些 ID 并返回事件 ID您的错误响应(通过您的自定义异常映射器)。这样,您可以在收到客户/客户的投诉之前主动监控错误,如果这样做,您可以将 eventId 链接到错误报告系统中的所有详细数据。

    【讨论】:

      【解决方案2】:

      Quarkus 是故意这样做的。

      在开发模式下,当您开发应用程序时,您希望获得所有可以获取的信息。 但是在生产模式下,您不希望将应用程序的内部信息泄露给调用者。 所以在这种情况下,您只能在服务器日志上看到堆栈跟踪

      【讨论】:

      • 我认为这是故意的,但我也认为它是可配置的,我可以关闭此功能。有没有办法配置/覆盖这种行为?
      • 不,没有
      猜你喜欢
      • 2017-05-08
      • 2023-03-14
      • 1970-01-01
      • 2013-09-25
      • 2012-09-21
      • 2015-06-23
      • 2011-01-05
      • 2013-07-31
      • 1970-01-01
      相关资源
      最近更新 更多