当前位置:网站首页>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
边栏推荐
猜你喜欢

Guaba and Computational Geometry

C language file operation

Detection technology and principle

Algèbre linéaire chapitre 1 - déterminants

Why does the subscript of the array start from 0 instead of 1?

Kalman filter and inertial integrated navigation

Rust的闭包类型(Fn, FnMut, FnOne的区别)
![[leetcode 202] happy number](/img/b2/a4e65688aef3a0cec8088bcaba048f.jpg)
[leetcode 202] happy number

从源代码到可执行文件的过程

Understanding and installing MySQL
随机推荐
MySQL advanced query
The most practical chrome plug-in
Mysql database foundation
Record the installation and configuration of gestermer on TX2, and then use GST RTSP server
Installation and usage skills of idea
基于QQwebAPI 查询昵称和头像的爬虫
Common shortcut keys of IDE
2. Average length of words
Import of data
-- SQL query and return limit rows
4. Print form
定位器
Collection and map thread safety problem solving
Explanation of the second I interval of 2020 Niuke summer multi school training camp
1007 go running (hdu6808) in the fourth game of 2020 Hangzhou Electric Multi school competition
12. Monkeys climb mountains
安全授信
Rust 中的 Cell 共享可变指针
Storing inherited knowledge in cloud computing
Plane semi intersecting plate