代码之家  ›  专栏  ›  技术社区  ›  samanime

在Spring Boot/Netty中更改错误日志记录

  •  0
  • samanime  · 技术社区  · 5 年前

    我有一个Spring引导应用程序正在为RESTAPI运行netty。

    我有一个WebExceptionHandler来处理可能发生的异常,这是有效的。它构建适当的响应并发送它们。

    问题是,它仍然将异常记录为一个错误。我想将其更改为将其记录为信息(因为我们有基于信息或错误的不同操作的跟踪和警报)。它甚至把404之类的记录为错误。

    看起来像 exceptionCaught in a ChannelInboundHandler 会有帮助的,但是 异常捕获 已弃用。我找不到任何不使用此方法的内容,也找不到任何与替换它的内容(如果有)相关的内容。

    我也试过用 @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)
      }
    }
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   yogananda    5 年前

    有关如何实现异常处理程序的详细信息将有所帮助。 下面是一个简单的实现,我遵循它来转换异常并记录它们。

     @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();
    }