feign如何打印出http請(qǐng)求
feign打印出http請(qǐng)求
用openfign依賴(lài)需要將請(qǐng)求的方法中的http請(qǐng)求打印出來(lái)
需要做如下兩步:
1.記錄請(qǐng)求和響應(yīng)的頭文件
正文和元數(shù)據(jù)的日志,需要在配置文件指出需要打印日志的類(lèi)
?@Bean
? ? Logger.Level feignLoggerLevel() {
? ? ? ? return Logger.Level.FULL;
? ? }2.在配置文件中配置對(duì)應(yīng)的包
logging: ? level: ? ? com.report.service.analysis.fegin.AdminServiceClient: debug
這樣就會(huì)生效了,如下:
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請(qǐng)求日志統(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 = "耗時(shí)";
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(" 請(qǐng)求入?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(" 請(qǐng)求入?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));
}
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線(xiàn)程、定時(shí)器同步首頁(yè)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線(xiàn)程、定時(shí)器同步首頁(yè)數(shù)據(jù),感興趣的小伙伴們可以參考一下2016-06-06
Java實(shí)戰(zhàn)之鮮花商城系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)鮮花商城系統(tǒng),文中采用的技術(shù)有Spring、SpringMVC、Mybatis、JSP等,感興趣的小伙伴可以了解一下2022-05-05
Java實(shí)戰(zhàn)之用Swing實(shí)現(xiàn)通訊錄管理系統(tǒng)
今天給大家?guī)?lái)的是Java實(shí)戰(zhàn)的相關(guān)知識(shí),文章圍繞著Swing實(shí)現(xiàn)通訊錄管理系統(tǒng)展開(kāi),文中有非常詳細(xì)的代碼示例,需要的朋友可以參考下2021-06-06
SpringBoot java-jar命令行啟動(dòng)原理解析
這篇文章主要介紹了SpringBoot java-jar命令行啟動(dòng)原理解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過(guò)程(連接數(shù)據(jù)庫(kù)進(jìn)行測(cè)試)
這篇文章主要介紹了springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過(guò)程(連接數(shù)據(jù)庫(kù)進(jìn)行測(cè)試),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08

