首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java Spring Boot框架- WebClient日志记录4xx/5xx主体响应

Java Spring Boot框架中的WebClient是一个用于发送HTTP请求的非阻塞客户端库。它提供了一种简单且灵活的方式来执行各种HTTP操作,如GET、POST、PUT、DELETE等,并且支持异步处理响应。

日志记录是一种重要的调试和排查问题的手段。在WebClient中,可以通过设置ExchangeFilterFunction来实现日志记录功能。ExchangeFilterFunction是一个函数接口,它可以在发送请求和接收响应的过程中拦截并处理请求和响应。

要记录4xx/5xx主体响应日志,可以在ExchangeFilterFunction中检查响应状态码,并将相应的响应体以及其他相关信息记录下来。以下是一个示例代码:

代码语言:txt
复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
import org.springframework.web.reactive.function.client.ExchangeFunction;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

@Component
public class WebClientLogger {

    private static final Logger logger = LoggerFactory.getLogger(WebClientLogger.class);

    public WebClient createWebClientWithLogging() {
        ExchangeStrategies strategies = ExchangeStrategies.builder()
                .codecs(configurer -> configurer
                        .defaultCodecs()
                        .maxInMemorySize(16 * 1024 * 1024)) // 设置请求和响应的最大内存大小
                .build();

        return WebClient.builder()
                .exchangeStrategies(strategies)
                .filter(logRequest())
                .build();
    }

    private ExchangeFilterFunction logRequest() {
        return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
            logRequestDetails(clientRequest);
            return Mono.just(clientRequest);
        });
    }

    private void logRequestDetails(ClientRequest clientRequest) {
        logger.info("Sending request: {} {}", clientRequest.method(), clientRequest.url());
        clientRequest.headers().forEach((name, values) -> values.forEach(value -> logger.info("{}: {}", name, value)));
    }
}

上述代码中,WebClientLogger类通过createWebClientWithLogging方法创建带有日志记录功能的WebClient实例。ExchangeStrategies用于配置请求和响应的编解码策略,其中maxInMemorySize方法设置了请求和响应的最大内存大小。

logRequest方法返回一个ExchangeFilterFunction,它拦截并记录请求的详细信息。在logRequestDetails方法中,可以根据需求自定义日志输出的格式和内容。

使用示例:

代码语言:txt
复制
WebClientLogger webClientLogger = new WebClientLogger();
WebClient webClient = webClientLogger.createWebClientWithLogging();

webClient.get()
        .uri("https://example.com/api/endpoint")
        .retrieve()
        .bodyToMono(String.class)
        .subscribe(responseBody -> logger.info("Response body: {}", responseBody));

在以上示例中,通过createWebClientWithLogging方法创建带有日志记录功能的WebClient实例。然后,使用该实例发送GET请求,并将响应体转换为字符串进行处理。

对于4xx/5xx主体响应,可以在logRequest方法中添加相应的处理逻辑,例如:

代码语言:txt
复制
private ExchangeFilterFunction logRequest() {
    return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
        logResponseDetails(clientResponse);
        return Mono.just(clientResponse);
    });
}

private void logResponseDetails(ClientResponse clientResponse) {
    HttpStatus statusCode = clientResponse.statusCode();
    if (statusCode.is4xxClientError() || statusCode.is5xxServerError()) {
        clientResponse.bodyToMono(String.class)
                .subscribe(responseBody -> {
                    logger.error("Error response ({}): {}", statusCode.value(), responseBody);
                });
    }
}

在以上代码中,通过ofResponseProcessor方法拦截并记录响应的详细信息。在logResponseDetails方法中,检查响应的状态码是否为4xx/5xx,如果是,则将响应体记录为错误日志。

注意:在实际应用中,应根据具体需求和安全性考虑,对日志的输出级别、内容和格式进行适当配置和保护。

推荐的腾讯云相关产品:云函数(Serverless Cloud Function)和云原生应用平台(Tencent Kubernetes Engine,TKE)。

  • 云函数:腾讯云的无服务器计算平台,可以快速构建和部署基于事件驱动的应用程序。它支持多种编程语言(如Java)和触发器,可以与其他腾讯云服务集成,如对象存储(COS)和消息队列(CMQ)等。详情请参考:云函数产品介绍
  • 云原生应用平台:腾讯云提供的基于Kubernetes的容器服务平台,支持快速部署和管理容器化应用程序。它提供了弹性伸缩、负载均衡、自动扩展等功能,并与腾讯云其他服务集成,如云数据库(TencentDB)和云监控(Cloud Monitor)等。详情请参考:云原生应用平台产品介绍
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

别再使用 RestTemplate了,来了解一下官方推荐的 WebClient

这意味着虽然 RestTemplate 仍然可用,但鼓励 Spring 开发人员迁移到新项目的 WebClient。...改进的错误处理:WebClient 提供比 RestTemplate 更好的错误处理和日志记录,从而更轻松地诊断和解决问题。...关注工众号:码猿技术专栏,回复关键词:1111 获取阿里内部Java性能调优手册!该函数将返回来自服务器的响应,或者如果请求由于任何原因失败,则返回一条错误消息。...(4) 处理4XX5XX错误: import org.springframework.http.HttpStatus; import org.springframework.http.MediaType...如果它是WebClientResponseException的实例,则代码将从异常中提取状态代码和状态文本,并将它们记录日志中。

1.7K30
  • 微服务架构之Spring Boot(七十九)

    57.3支持的度量标准 Spring Boot在适用时注册以下核心指标: JVM指标,报告利用率: 各种内存和缓冲池 与垃圾收集有关的统计 线程利用率 加载/卸载的类数 CPU指标 文件描述符指标 卡夫卡消费者指标...1xx是 INFORMATIONAL ,2xx是 SUCCESS ,3xx是 REDIRECTION ,4xx CLIENT_ERROR , 5xx是 SERVER_ERROR status 响应的HTTP...1xx是 INFORMATIONAL ,2xx是 SUCCESS ,3xx是 REDIRECTION ,4xx CLIENT_ERROR , 5xx是 SERVER_ERROR status 响应的HTTP...57.3.4 HTTP客户端度量标准 Spring Boot Actuator管理 RestTemplate 和 WebClient 的工具。...默认情况下,Spring Boot为所有支持的数据源提供元数据; 如果您不喜欢自己喜欢的数据源,则可以添加额外 的 DataSourcePoolMetadataProvider beans。

    77810

    SpringCloud升级之路2020.0.x版-2.微服务框架需要考虑的问题

    健康检查:由于 K8s 需要进程提供健康检查接口,我们使用 Spring Boot 的 actuator 功能,来作为健康检查接口。...我们一般不使用 @LoadBalanced 注解的 RestTemplate 对于同步的 spring-flux,一般使用 WebClient 进行调用。...在 Spring Boot 2.3.x 之后,引入了这个功能,在我们这个系列中也会用到。...如下图所示: 2.当调用一个微服务返回了非 2XX 的响应码: a) 4XX:在发布接口更新的时候,可能调用方和被调用方都需要发布。...假设新的接口参数发生变化,没有兼容老的调用的时候,就会有异常,一般是参数错误,即返回 4XX响应码。例如新的调用方调用老的被调用方。针对这种情况,重试可以解决。

    44510

    漏洞复现 - - - Springboot未授权访问

    未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷导致其他用户可以直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露 二,Actuator介绍 Spring Boot...基本上是 Spring 框架的扩展。 ...分析web 应用使用的框架为 springboot 框架 2.如果web应用开发者没有修改springboot web默认图标 3.如果修改了默认图标,我们通过访问refresh web网页报错进行分析...,如果 web 应用开发者没有修改 springboot web 应用的默认 4xx5xx 报错页面,那么当 web 应用程序出现 4xx5xx 错误时,会报错如下如图所示 四,实验环境 靶机:Centos7...地址:10.1.1.135 五,漏洞复现 1.通过访问env获取全部环境属性 2.通过/trace提供基本的http请求跟踪信息 3.利用反序列化进行getshell 需要以下两个包(环境已安装) spring-boot-starter-actuator

    4.8K20

    伙计,来跟我一起学SpringBoot! 【第一弹】

    SpringBoot:底层是Spring框架Spring框架默认是用JCL在框架内部使用JCL***,spring-boot-starter-logging采用了slf4j+logback的形式 Spring...解决步骤: 将系统中其他日志框架先排除出去 用中间包来替换原有的日志框架 我们导入slf4j 或其他的日志实现 2)SpringBoot日志关系 org.springframework.boot...小结: SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可 SpringBoot 底层也是使用...Log4j2 log4j2-spring.xml or log4j2.xml JDK (Java Util Logging) logging.properties logback.xml:直接会被日志框架识别...步骤: 系统出现4xx或者5xx之类的错误:ErrorPageCustomizer就会生效(定制错误的响应规则),就会来到/error请求;就会被BasicErrorController处理 响应页面:

    84420

    Spring Cloud 升级之路 - 2020.0.x - 1. 背景知识、需求描述与公共依赖

    微服务之间调用依然基于利用 open-feign 的方式,有重试,仅对GET请求并且状态码为4xx5xx进行重试(对4xx重试是因为滚动升级的时候,老的实例没有新的 api,重试可以将请求发到新的实例上...网关相关: 通过metamap中的zone配置鉴别所处集群,仅把请求转发到相同集群的微服务实例 转发请求,有重试,仅对GET请求并且状态码为4xx5xx进行重试 不同微服务的不同实例线程隔离 实现实例级别的熔断...不论是Java自带的Future框架,还是 Spring WebFlux,还是 Vert.x,他们都是一种非阻塞的基于Ractor模型的框架(后两个框架都是利用netty实现)。...Java 响应式编程的未来会怎样?是否会有另一种解决办法?我个人觉得,如果有兴趣可以研究下响应式编程 WebFlux,但是不必强求一定要使用响应式编程。...Webflux 微服务相关依赖 对于 Webflux 响应式风格的微服务,其实就是将 spring-boot-starter-web 替换成 spring-boot-starter-webflux 即可

    55220

    【深圳五兴科技】Java后端面经

    AOP(面向切面编程):Spring 支持 AOP 编程,通过切面(Aspect)将横切逻辑(如日志记录、事务管理等)与核心业务逻辑分离,提高了代码的模块化和可重用性。...4、Spring Boot 和传统 Spring 框架的一些区别 Spring Boot 是基于 Spring 框架的一个开发框架,它旨在简化基于 Spring 的应用程序的配置和部署。...而传统的 Spring 框架需要手动配置大量的 XML 或 Java 配置文件。...Spring 框架本身提供了解决循环依赖的机制,而 Spring Boot 作为基于 Spring 的快速开发框架,并未改变这一机制。...8、接口响应慢的处理思路 理接口响应慢的问题需要综合考虑系统性能、网络延迟、数据库查询等多个方面,以下是一些处理思路: 性能监控和日志分析: 首先,需要对系统进行性能监控和日志分析,通过监控工具和日志记录系统的响应时间

    13910

    《JavaEE进阶》----3.<SpringBoot项目创建细节大全+打jar包运行>

    什么是Spring Spring是一个开源框架 现在暂时只需要了解这个。后续在SpringIOC&ID博客中会详细的讲解SpringSpring让开发Java工程项目变得更快、更简单、更安全。...是世界上最受欢迎的Java框架 Spring在面试中其实说的就是Spring家族。...它包含SpringSpring Framework)、Spring BootSpring MVC、Spring Cloud。等等许多框架。...1.9HTTP状态码(对应错误解决方法) 2xx:表示访问成功 3xx:表示重定向 4xx:客户端发生错误 5xx:服务器发生错误 404:通常表示请求的url不存在 若发生这个错误我们可以 1.检查...2.2运行jar包 通过 java -jar Jar包名字 命令来启动 端口号冲突 启动的日志和我们在idea启动的日志是一模一样的。 在linux启动需要我们打成jar包。

    14310

    艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~

    艿艿:V2EX 上还有这样一个讨论 《现在有公司在使用 Spring Boot 2.0 的 WebFlux 吗?》 。 响应式编程,对我们现有的编程方式,是一场颠覆,对于框架也是。...所以,WebFlux 想要能够真正普及到我们的项目中,不仅仅需要 Spring 自己体系中的框架提供对响应式编程的很好的支持,也需要 Java 生态中的框架也要做到如此。例如说: ? 艿艿:?...1.2 Reactor 框架Java 生态中,提供响应式编程的框架主要有 Reactor、RxJava、JDK9 Flow API 。...方法中,我们还多使用 logger 打印了错误日志,方便我们接入 ELK 等日志服务,发起告警,通知我们去排查解决。如果胖友的系统里暂时没有日志服务,可以记录错误日志到数据库中,也是不错的选择。...而其它两个方法,因为是更偏业务的,相对正常的异常,所以无需记录错误日志

    5.9K12

    Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错

    Boot 启动类注解 点击启动类的 main 方法就可以运行 Spring Boot 项目了,启动成功如下图所示: 2....输出 Hello world JavaEE 更多是围绕着如何使用 Java 来进行 web 开发。...Tomcat 自身的日志,观察是否存在报错 出现连接失败往往意味着服务没有正确启动,也需要观察服务器的自身日志是否有错误提示 程序猿调试 BUG 如同医生诊病 一个有经验的程序猿和一个新手程序猿相比...如同一个问题可能新手花了几天都无法解决,但是有经验的程序猿可能几分钟就搞定了 总结 Spring Boot 是为了快速开发 Spring 而诞生的,Spring Boot 具备: Spring Boot...,可以更好的了解项目的运行情况等特点 Spring Boot 可使用 IDEA 或网页创建,它的设计思想是约定大于配置,类上标注@SpringBootApplication 就可以启动 Spring

    15110

    Spring Boot 异常处理,值得学习!

    4xx,5xx,error(自定义) 常用的是404和500响应 404 (未找到) 服务器找不到请求的网页 服务器内部错误 服务器遇到错误,无法完成请求 在templates文件下创建404.html...Logger这个只是在控制台输出,或者绑定了日志,会输出到日志中。...最新 Spring Boot 面试题整理好了,大家可以在Java面试库小程序在线刷题。 按照学习的来说。当页面为null的时候,向上抛出一个自定义的异常类,该异常类标注了异常状态。...Java 18 发布,默认 UTF-8,finalize 被弃用。。 Spring Boot 3.0 M1 发布,正式弃用 Java 8 Spring Boot 学习笔记,这个太全了!...关注Java技术栈看更多干货 获取 Spring Boot 实战笔记!

    88540

    (5)Spring WebFlux快速上手——响应Spring的道法术器「建议收藏」

    前情提要:响应式流 | lambda与函数式 | Reactor快速上手 1.3.3 Spring WebFlux Spring WebFlux是随Spring 5推出的响应式Web框架。...2)响应式Http客户端 此外,Spring WebFlux也提供了一个响应式的Http客户端API WebClient。它可以用函数式的方式异步非阻塞地发起Http请求并处理响应。...虽然这种方式在开发上与Spring WebMVC变化不大,但是框架底层已经是完全的响应式技术栈了; 再进一步介绍函数式的开发模式; 简单几行代码实现服务端推送(Server Send Event,SSE...Spring Boot 2是基于Spring 5的,其中一个比较大的更新就在于支持包括spring-webflux和响应式的spring-data在内的响应式模块。...我们使用Spring Boot 2搭建项目框架。 以下截图来自IntelliJ IDEA,不过其他IDE也都是类似的。

    4.1K20

    Spring Cloud升级之路 - Hoxton - 1.背景介绍与要实现的功能

    例如我们之前的升级路线就是:Brixton -> Daltson -> Finchley -> 当前的Hoxton 做了这么多次升级,感觉可以出这个系列,来分享我们项目使用Spring cloud框架实现的框架功能...cloud实现FeignClient指定Zone调用 微服务之间调用,有重试,只对GET请求进行重试,连接超时,读取超时还有 4xx5xx 的状态码都会重试。...网关 以前的体系: API网关:Zuul 实现的功能: 重试,只对GET请求进行重试,连接超时,读取超时还有 4xx5xx 的状态码都会重试。...微服务 微服务之间调用依然基于利用 open-feign 的方式,有重试,仅对GET请求并且状态码为4xx5xx进行重试(对4xx重试是因为滚动升级的时候,老的实例没有新的 api,重试可以将请求发到新的实例上...网关 转发请求,有重试,仅对GET请求并且状态码为4xx5xx进行重试 不同微服务的不同实例线程隔离 实现实例级别的熔断。

    1.3K20
    领券