当前位置:网站首页>Feign请求日志统一打印
Feign请求日志统一打印
2022-04-23 05:45:00 【dawnsun001】
@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));
}
}
}
版权声明
本文为[dawnsun001]所创,转载请带上原文链接,感谢
https://blog.csdn.net/dawnsun2013/article/details/124330000
边栏推荐
猜你喜欢
Robocode教程4——Robocode的游戏物理
20 excellent plug-ins recommended by idea
基于pygame库编写的五子棋游戏
定位器
A solution to replace not in in SQL
Addition, deletion, query and modification of data
How SYSTEMd uses / etc / init D script
Installation and usage skills of idea
-- SQL query and return limit rows
基于Sentinel+Nacos 对Feign Client 动态添加默认熔断规则
随机推荐
Integration and induction of knowledge points of automatic control principle (Han min version)
词频统计
Miscellaneous 1
Rust: Tcp 服务器与客户端的一个简单例子
[leetcode 290] word rules
[leetcode 228] summary interval
1007 go running (hdu6808) in the fourth game of 2020 Hangzhou Electric Multi school competition
線性代數第一章-行列式
批量导出Arcgis属性表
基于Sentinel+Nacos 对Feign Client 动态添加默认熔断规则
Object转Json差异之Gson fastJson jackson 修改字段名
Usage scenario of copyonwritearraylist
9.Life, the Universe, and Everything
20 excellent plug-ins recommended by idea
P1018 maximum product solution
SQL -- data filtering and grouping
Database - sorting data
Generation of verification code
7-21日错题涉及知识点。
Generate excel template (drop-down selection, multi-level linkage)