java - 更改 Spring Boot/Netty 中的错误日志记录

标签 java spring spring-boot kotlin netty

我有一个为 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)
  }
}

最佳答案

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

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

关于java - 更改 Spring Boot/Netty 中的错误日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55150880/

相关文章:

java - 没有 Maven 的 Spring MyBatis

TOMCAT 中的 JAVA SOAP 服务依赖关系

java - 使用 Spring-Boot 和 Jetty 设置 SSL

java - 将嵌入的 JSON 字符串反序列化为类型化对象

java - jaxb 实体打印为 xml

java - android通知显示来自没有unicode的字符串的图像

java - 多数据库应用SpringBoot、Hibernate和JPA

Spring Sessions HttpSession无法完全替代JSESSIONID

java - 无需测试和 ng 服务的 angular-cli 简单配置

java - 使用 @ImportResource 导入 XML 配置不起作用