feign如何打印出http请求

目录
  • feign打印出http请求
    • 1.记录请求和响应的头文件
    • 2.在配置文件中配置对应的包
  • feign请求日志统一打印

feign打印出http请求

用openfign依赖需要将请求的方法中的http请求打印出来

需要做如下两步:

1.记录请求和响应的头文件

正文和元数据的日志,需要在配置文件指出需要打印日志的类

 @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

2.在配置文件中配置对应的包

logging:
  level:
    com.report.service.analysis.fegin.AdminServiceClient: debug

这样就会生效了,如下:

ms] ---> END HTTP (0-byte body)
2021-01-14 10:57:34.525 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] <--- HTTP/1.1 200 (98ms)
2021-01-14 10:57:34.525 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] connection: keep-alive
2021-01-14 10:57:34.525 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] content-type: application/json
2021-01-14 10:57:34.525 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] date: Thu, 14 Jan 2021 02:57:34 GMT
2021-01-14 10:57:34.525 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] server: nginx/1.19.0
2021-01-14 10:57:34.526 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - ServiceClient#getDealerItemListByParams] transfer-encoding: chunked
2021-01-14 10:57:34.526 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] vary: Accept-Encoding
2021-01-14 10:57:34.526 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] 
2021-01-14 10:57:34.528 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] {"code":"000000","description":"SUCCESS","data":
2021-01-14 10:57:34.528 [http-nio-8080-exec-1] DEBUG c.n.s.r.service.analysis.fegin.AdminServiceClient - TID: N/A - [ServiceClient#getDealerItemListByParams] <--- END HTTP (2692-byte body)

feign请求日志统一打印

@Slf4j
public class FeignLogger extends feign.Logger {
    static ThreadLocal<Map<String, String>> logContext = new ThreadLocal();
    static String PATH = "path";
    static String METHOD = "method";
    static String REQUEST_BODY = "body";
    static String ELAPSED_TIME = "耗时";
    static String ELAPSED_TIME_UNIT = "毫秒";
    static String FEIGN_INVOKE_LOGGER = "feign 接口调用";
    @Override
    protected void logRequest(String configKey, Level logLevel, Request request) {
        Map<String, String> logMap = new HashMap<>(3);
        logMap.put(PATH, request.url());
        logMap.put(METHOD, request.method());
        logMap.put(REQUEST_BODY, request.body() == null ? null :
                request.charset() == null ? null : new String(request.body(), request.charset()));
        logContext.set(logMap);
    }
    @Override
    protected Response logAndRebufferResponse(
            String configKey, Level logLevel, Response response, long elapsedTime) throws IOException {
        Map<String, String> requetParam = logContext.get();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder
                .append(FEIGN_INVOKE_LOGGER).append(" ")
                .append(requetParam.get(METHOD)).append(" ")
                .append(response.status()).append(" ")
                .append(requetParam.get(PATH)).append(" ")
                .append(ELAPSED_TIME).append(elapsedTime).append(ELAPSED_TIME_UNIT);
        if (requetParam.get(REQUEST_BODY) != null) {
            stringBuilder.append(" 请求入参:").append(requetParam.get(REQUEST_BODY));
        }
        logContext.remove();
        // 返回参数
        if (response.body() != null && !(response.status() == 204 || response.status() == 205)) {
            byte[] bodyData = Util.toByteArray(response.body().asInputStream());
            if (bodyData.length > 0) {
                String responseBody = decodeOrDefault(bodyData, UTF_8, "Binary data");
                stringBuilder
                        .append(" 返回值:")
                        .append(responseBody.replaceAll("\\s*|\t|\r|\n", ""));
            }
            log.info(stringBuilder.toString());
            return response.toBuilder().body(bodyData).build();
        }
        log.info(stringBuilder.toString());
        return response;
    }
    protected IOException logIOException(String configKey, Level logLevel, IOException ioe, long elapsedTime) {
        Map<String, String> requetParam = logContext.get();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder
                .append(FEIGN_INVOKE_LOGGER).append(" ")
                .append(requetParam.get(METHOD)).append(" ")
                .append(ioe.getClass().getSimpleName()).append(" ")
                .append(requetParam.get(PATH)).append(" ")
                .append(ELAPSED_TIME).append(elapsedTime).append(ELAPSED_TIME_UNIT);;
        if (requetParam.get(REQUEST_BODY) != null) {
            stringBuilder.append(" 请求入参:").append(requetParam.get(REQUEST_BODY));
        }
        log.warn(stringBuilder.toString());
        logContext.remove();
        return ioe;
    }
    @Override
    protected void log(String configKey, String format, Object... args) {
        if (log.isInfoEnabled()) {
            log.info(String.format(methodTag(configKey) + format, args));
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • @FeignClient 实现简便http请求封装方式

    目录 @FeignClient实现http请求封装 使用流程 将http请求封装为FeignClient 1.配置拦截器 2.注入feignClientbean 3.配置pom引用 4.写feignClient 5.写熔断器 @FeignClient实现http请求封装 我们一般在代码中调用http请求时,都是封装了http调用类,底层自己定义请求头,在写的时候,也是需要对返回的值进行json解析,很不方便. name:name属性会作为微服务的名称,用于服务发现 url:host的意思,不用加

  • 使用feign发送http请求解析报错的问题

    目录 错误如下 错误原因 解决方案一 解决方案二 错误2 错误如下 发送请求开始 ----- [ChannelFeign#formRecog] ---> END HTTP (304117-byte body) 发送请求结束 返回开始 [ChannelFeign#formRecog] <--- HTTP/1.1 200 OK (4948ms) [ChannelFeign#formRecog] content-length: 5207 [ChannelFeign#formRecog] conten

  • Java 如何使用Feign发送HTTP请求

    在往常的 HTTP 调用中,一直都是使用的官方提供的 RestTemplate 来进行远程调用,该调用方式将组装代码冗余到正常业务代码中,不够优雅,因此在接触到 Feign 后,考虑使其作为一个 HTTP 发送基础,来进行远程调用. 下面就让我们来看一下,其是如何使用的. 引入依赖 首先,我们需要将 Feign 的基础依赖引入项目,因为我们只使用 Feign 的 remote 功能,因此,只引入基础依赖. 此外在项目中,我们还自定义了了 JSON 转换和 log 设置,因此还需要引入这些的第三方

  • feign如何打印出http请求

    目录 feign打印出http请求 1.记录请求和响应的头文件 2.在配置文件中配置对应的包 feign请求日志统一打印 feign打印出http请求 用openfign依赖需要将请求的方法中的http请求打印出来 需要做如下两步: 1.记录请求和响应的头文件 正文和元数据的日志,需要在配置文件指出需要打印日志的类  @Bean     Logger.Level feignLoggerLevel() {         return Logger.Level.FULL;     } 2.在配置文

  • Spring Cloud如何使用Feign构造多参数的请求

    本节我们来探讨如何使用Feign构造多参数的请求.笔者以GET以及POST方法的请求为例进行讲解,其他方法(例如DELETE.PUT等)的请求原理相通,读者可自行研究. GET请求多参数的URL 假设我们请求的URL包含多个参数,例如http://microservice-provider-user/get?id=1&username=张三 ,要如何构造呢? 我们知道,Spring Cloud为Feign添加了Spring MVC的注解支持,那么我们不妨按照Spring MVC的写法尝试一下:

  • 解决在微服务环境下远程调用feign和异步线程存在请求数据丢失问题

    目录 一.无异步线程得情况下feign远程调用: 1.登录拦截器: 2.问题示例图: 3.解决方法: 解决方式(高亮部分):从总线中获取request数据放入子线程中 二.异步情况下丢失上下文问题: 一.无异步线程得情况下feign远程调用: 1.登录拦截器: @Component public class LoginUserInterceptor implements HandlerInterceptor { public static ThreadLocal<MemberResVo> lo

  • SpringBoot feign动态设置数据源(https请求)

    目录 1.背景 2.代码 2.2. 编写请求方法 2.3.发送请求 总结: 1.背景 在使用springboot-feign/spingcloud-feign时,需要在启动springboot的时候,注入的方式将feigncofing配置好,也就是说项目启动以后只能有一个数据源,且不能修改,在网上找了很多资料没有找到解决方案(网上应该有,只是我没有找到),后面只能是硬着头皮看源码,问题解决,在此记录一下,希望可以帮到有缘人 2.代码 其实在这里用的原生的feign,并不是springboot/s

  • 解决Spring Cloud Feign 请求时附带请求头的问题

    问题描述 Feign 在请求时是不会将 request 的请求头带着请求的,导致假如 Feign 调用的接口需要请求头的信息,比如当前用户的 token 之类的就获取不到 解决方案 FeignConfiguration 通过实现 Feign 的 RequestInterceptor 将从上下文中获取到的请求头信息循环设置到 Feign 请求头中. /** * feign 配置文件 * 将请求头中的参数,全部作为 feign 请求头参数传递 * @author: linjinp * @create

  • 使用Feign调用时添加验证信息token到请求头方式

    目录 Feign调用添加验证信息token到请求头 1.这是最简单的一个方法 2.这个方法是网上大多数人的用法 3.第三种方法就是大神的方法了 Feign中增加请求头 最近遇到项目在调用 Feign调用添加验证信息token到请求头 1.这是最简单的一个方法 但是需要对每个调用都一一添加,就是使用@RequestHeader注解添加参数到请求头中去 @FeignClient(name = "capability-register", fallback = ApiServiceClien

  • 使用Feign传递请求头信息(Finchley版本)

    目录 Feign传递请求头信息 实现RequestInterceptor接口 注册配置 Feign调用微服务传递header请求头 Feign传递请求头信息 在我之前的文章服务网关Spring Cloud Zuul中,将用户的登录id放在了请求头中传递给内部服务. 但是当内部服务之间存在feign调用时,那么请求头信息会在feign请求的时候传递吗?不会,请求的头信息和请求参数都不会进行传递. 但是我们可以通过通过实现RequestInterceptor接口,完成对所有的Feign请求,传递请求

  • 全局记录Feign的请求和响应日志方式

    目录 1.项目里定义FeignClient接口 2.单个FeignClient接口开启日志 3.所有FeignClient接口 开启日志 3.1.修改FeignConfiguration 3.2.还是修改 application.yml 配置 2.3.OK了,此时项目里 4.重写FeignClient输出日志 5.使用Aspect切面输出日志 项目里使用了Feign进行远程调用,有时为了问题排查,需要开启请求和响应日志 下面简介一下如何开启Feign日志: 注:本文基于 spring-boot-

  • 详解Spring Cloud Feign 熔断配置的一些小坑

    1.在使用feign做服务调用时,使用继承的方式调用服务,加入Hystrix的熔断处理fallback配置时,会报错,已解决. 2.使用feign默认配置,熔断不生效,已解决. 最近在做微服务的学习,发现在使用feign做服务调用时,使用继承的方式调用服务,加入Hystrix的熔断处理fallback配置时,会报错,代码如下: @RequestMapping("/demo/api") public interface HelloApi { @GetMapping("user/

  • Spring cloud Feign 深度学习与应用详解

    简介 Spring Cloud Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数.格式.地址等信息.Feign会完全代理HTTP请求,开发时只需要像调用方法一样调用它就可以完成服务请求及相关处理.开源地址:https://github.com/OpenFeign/feign.Feign整合了Ribbon负载和Hystrix熔断,可以不再需要显式地

随机推荐