feign如何打印出http請求
feign打印出http請求
用openfign依賴需要將請求的方法中的http請求打印出來
需要做如下兩步:
1.記錄請求和響應(yīng)的頭文件
正文和元數(shù)據(jù)的日志,需要在配置文件指出需要打印日志的類
?@Bean ? ? Logger.Level feignLoggerLevel() { ? ? ? ? return Logger.Level.FULL; ? ? }
2.在配置文件中配置對應(yīng)的包
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請求日志統(tǒng)一打印
@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 接口調(diào)用"; @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(" 請求入?yún)?").append(requetParam.get(REQUEST_BODY)); } logContext.remove(); // 返回參數(shù) 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(" 請求入?yún)?").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)); } } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
微服務(wù)?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能
這篇文章主要介紹了微服務(wù)?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能,文章簡單介紹了Redis BitMap 基本用法結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01Java使用POI實現(xiàn)導(dǎo)出Excel的方法詳解
在項目開發(fā)中往往需要使用到Excel的導(dǎo)入和導(dǎo)出,導(dǎo)入就是從Excel中導(dǎo)入到DB中,而導(dǎo)出就是從DB中查詢數(shù)據(jù)然后使用POI寫到Excel上。本文將利用POI實現(xiàn)導(dǎo)出Excel,需要的可以參考一下2022-10-10IntelliJ IDEA下自動生成Hibernate映射文件以及實體類
這篇文章主要介紹了IntelliJ IDEA下自動生成Hibernate映射文件以及實體類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Java中實現(xiàn)文件預(yù)覽的功能(實例代碼)
大家都知道word,Excel,PPT實現(xiàn)在線預(yù)覽常用的方式就是先轉(zhuǎn)換成pdf,然后在進行預(yù)覽,下面給大家介紹Java中如何實現(xiàn)文件預(yù)覽的功能,需要的朋友可以參考下2023-05-05Java 并發(fā)編程學(xué)習(xí)筆記之Synchronized簡介
雖然多線程編程極大地提高了效率,但是也會帶來一定的隱患。比如說兩個線程同時往一個數(shù)據(jù)庫表中插入不重復(fù)的數(shù)據(jù),就可能會導(dǎo)致數(shù)據(jù)庫中插入了相同的數(shù)據(jù)。今天我們就來一起討論下線程安全問題,以及Java中提供了什么機制來解決線程安全問題。2016-05-05