feign如何打印出http请求

发布时间:2023-08-29 15:30

目录
  • 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> 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 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 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 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));
            }
        }
    }
    

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

    ItVuer - 免责声明 - 关于我们 - 联系我们

    本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

    桂ICP备16001015号