【问题标题】:Logging and Exception handling in a micro-service in JavaJava微服务中的日志记录和异常处理
【发布时间】:2017-12-07 19:14:33
【问题描述】:

我正在开发一个微服务,它根据存储在自己的数据存储中的某些配置进行一些计算。计算 API 通过 REST API 存储。该应用程序是一个弹簧启动应用程序。 现在应用中主要有3层:

  1. REST 控制器
  2. 服务层
  3. DAO 层 - 它使用了 spring 数据。

我计划使用以下几点来处理日志记录和异常处理:

  • 记录服务接收和响应的每个请求或至少 如果状态不是 2xx 系列的响应。

  • 如果在 DAO 层或服务中存在任何已检查的异常 层然后记录它们并抛出一个自定义异常 运行时异常。

  • 有几个自定义异常应该从服务中抛出 层主要是在我们遇到无效值、null 等场景时 值等。

  • 在 REST 控制器中有一个 try catch 块并记录 异常,即消息以及堆栈跟踪并返回 做出相应的回应。

所以总体思路是让 RuntimeExceptions 一直传播到 REST 控制器,在那里它们应该被记录并相应地发送响应。如果发生检查的异常,则将它们记录在相同的方法中,并改为抛出自定义异常。

请建议在此类应用程序中记录异常的正确或好的方法。

【问题讨论】:

    标签: java spring-boot exception-handling


    【解决方案1】:

    controller advice,它将捕获所有异常并记录所需的内容。您可能会在此处捕获异常。我实施了您在此处提出的相同要求。

    */
    /**
     * Uncaught exception handler
     * @param e - Exception
     */
    @ExceptionHandler(Exception.class)
    @ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public void handleError(Exception e,HttpServletRequest request, HttpServletResponse response){
        logger.error("Exception occured : {}",e);
            //logs request & response here
    }
    

    另外请查看此处描述的AbstractRequestLoggingFilter

    对于所有自定义应用程序特定的异常,创建您自己的自定义异常类型并在上面代码块中指定的 @ExceptionHandler 的帮助下处理它。

    【讨论】:

      【解决方案2】:

      只选择一个地方记录异常。

      在你的设计中,如果 DAO 发生异常,它会:

      • 登录 DAO
      • 然后触发运行时异常,该异常会被捕获并登录到控制器中
      • 然后应该通过 REST 返回非 2xx 响应状态,这将根据您的第一点触发记录响应

      因此,您将在三个位置获得相同的信息,或者您将在日志中的两到三个位置获得有关单个错误的不同信息。

      选择一个地方来记录错误,并确保所有相关信息都存在于那个地方(即将底层 DAO 异常设置为运行时异常的原因,并且不要忘记将运行时异常与原因)。

      【讨论】:

      • 所以你是说即使我的例如AccountService(不是 Controller)抛出“AccountLoginFailedException”(从 RuntimeException 派生),我应该在 RestController(或附加的 ControllerAdvice)中处理异常?跨度>
      • @Igor 你应该想想谁能真正处理这个异常。服务能以合理的方式处理吗?如果是这样,那就处理它。如果不是,则将其包装在您自己的异常中,提供服务知道的其他详细信息,或者将其重新抛出给调用者。
      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 2018-03-16
      • 2020-01-25
      • 2012-02-10
      相关资源
      最近更新 更多