【问题标题】:Changing error logging in Spring Boot/Netty在 Spring Boot/Netty 中更改错误日志记录
【发布时间】:2019-03-13 20:41:34
【问题描述】:

我有一个为 REST API 运行 Netty 的 Spring Boot 应用程序。

我有一个 WebExceptionHandler 来处理可能发生的异常,它正在工作。它构建适当的响应并发送它们。

问题是,它仍然将异常记录为错误。我想将其更改为将其记录为信息(因为我们有根据信息或错误进行不同操作的跟踪和警报)。它甚至会将 404 之类的内容记录为错误。

似乎exceptionCaught in a ChannelInboundHandler 会有所帮助,但exceptionCaught 已被弃用。我找不到任何不使用这种方法的东西,也找不到任何指代它的东西(如果有的话)。

我也尝试使用@ControllerAdvice@RestControllerAdvice@ExceptionHandler,但从未调用过。

拦截和处理异常日志的正确方法是什么?


我们当前设置的最小示例实现如下所示:

@RestController
class MyController {
  @RequestMapping(method = [GET], value = ["endpoint"], produces = [APPLICATION_JSON_VALUE])
  fun myEndpoint(): Mono<MyResponse> = createResponse()
}

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class MyWebExceptionHandler : WebExceptionHandler {
  // This does get called and sends the appropriate response back, but an error is logged somewhere outside of our code.
  override fun handle(exchange: ServerWebExchange, ex: Throwable): Mono<Void> = 
    createErrorResponse();
}

// Tried using both, or just one at a time, no difference.
// It does get created.
@ControllerAdvice
@RestControllerAdvice
class MyExceptionHandler {
  // Never called
  @ExceptionHandler(Exception::class)
  fun handle(ex: Exception) {
    log.error(ex.message)
  }
}

【问题讨论】:

    标签: java spring spring-boot kotlin netty


    【解决方案1】:

    有关如何实现异常处理程序的更多信息会很有帮助。 这是一个简单的实现,我按照它来转换异常并记录它们。

     @ControllerAdvice 
    public class DefaultExceptionHandler extends ResponseEntityExceptionHandler {
        private static final Logger LOG = LoggerFactory.getLogger(DefaultExceptionHandler.class);
        private static String ERROR = "ERROR";
    
        @ExceptionHandler(Exception.class)
        ResponseEntity<Map<String, Map<String, String>>> exception(Exception e) {
            Map<String,Map<String,String>> map = new HashMap<>(1);
            Map<String,String> m = new HashMap<>(1);
            m.put("message",e.getMessage());
            map.put(ERROR, m);
            LOG.info("some error " + e);
            return new ResponseEntity<>(map, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    
    }
    

    另外不要忘记创建一个 bean 或将你的 ExceptionHandler 类添加到 spring 配置中。

    @Bean
    public DefaultExceptionHandler defaultExceptionHandler(){
        return new DefaultExceptionHandler();
    }
    

    【讨论】:

    • 这是我尝试过的,不幸的是它从来没有进入他们的。看起来我没有ResponseEntityExceptionHandler,因为我们的版本不是最新的。但是,我已经添加了异常处理程序逻辑的其余部分,并且它永远不会被调用。我们的WebExceptionHandler 用于处理发送错误响应(正常工作),但其他东西正在记录日志,这是我试图拦截的。
    • @samanime 是否可以分享您的 ExceptionHandler 实现,以便我可以尝试重现它或更好地了解您要做什么。
    • 我用我们拥有的相关位的最小实现来更新我的问题。如果您需要更多信息,请告诉我。谢谢。
    • 我假设您将 MyExceptionHandler 类连接到 spring 配置。如果不能,您可以尝试将@Component 添加到 MyExceptionHandler 类,我认为它连接不正确。
    猜你喜欢
    • 2017-12-26
    • 2017-11-01
    • 1970-01-01
    • 2020-02-27
    • 2021-01-18
    • 2015-08-14
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多