当前位置:网站首页>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
边栏推荐
猜你喜欢
GDAL+OGR学习
Robocode教程4——Robocode的游戏物理
Generate excel template (drop-down selection, multi-level linkage)
Type conversion in C #
Mysql database foundation
MySQL advanced query
Integration and induction of knowledge points of automatic control principle (Han min version)
Generation of verification code
How SYSTEMd uses / etc / init D script
Understanding and installing MySQL
随机推荐
SVN简单操作命令
Introduction to virtualization features
Best practices for MySQL storage time
Rainbow (DP)
用C语言实现重写strcmp等四个函数
Doomsday (simple computational geometry)
爬取手游网站游戏详情和评论(MQ+多线程)
scikit-learn sklearn 0.18 官方文档中文版
POJ - 2955 brackets interval DP
Optional best practices
Guaba and Computational Geometry
GNU EFI header file
Techniques et principes de détection
Record the installation and configuration of gestermer on TX2, and then use GST RTSP server
2. Average length of words
Cf515b drazil and his happy friends
Usage scenario of copyonwritearraylist
C language file operation
3. Continuous integer
[leetcode 150] evaluation of inverse Polish expression