FeignClient日志打印
一、使用feign原生的配置方式1、新增配置类,设置日志级别@Slf4j@Configurationpublic class FeignConfig {/*** feign 日志记录级别* NONE:无日志记录(默认)* BASIC:只记录请求方法和 url 以及响应状态代码和执行时间。* HEADERS:记录请求和响应头的基本信息。* FULL:记录请求和响应的头、正文和元数据。** @retu
一、使用feign原生的配置方式
1、新增配置类,设置日志级别
@Slf4j
@Configuration
public class FeignConfig {
/**
* feign 日志记录级别
* NONE:无日志记录(默认)
* BASIC:只记录请求方法和 url 以及响应状态代码和执行时间。
* HEADERS:记录请求和响应头的基本信息。
* FULL:记录请求和响应的头、正文和元数据。
*
* @return Logger.Level
*/
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
2、为需要打印日志的类增加配置
@FeignClient(url = "${project.host}")
public interface RequestTestApi {
@GetMapping("/pengjx/test")
String send(@RequestParam("name") String name);
}
# logging.level后面是具体的类全路径
logging.level.pengjx.feign.RequestTestApi=DEBUG
日志打印:
二、自定义日志打印
1、重写Feign.Logger
简单看下源码,了解下默认的日志打印信息及格式
log是我们继承Logger后需要实现的接口,就是常写的日志打印语句,只不过打印的内容,feign作为参数传给我们了,个人理解是为了兼容不同的日志版本。
logRequest:打印请求的信息,从源码中可以看出根据日志级别打印不同的信息
logAndRebufferResponse:打印响应信息,从源码中可以看出根据日志级别打印不同的信息
一般我们Http请求只需要打印请求地址,请求报文和返回报文,其他的信息不回太关心,但是如果级别设置为FULL,会打印出很多的其他信息,如header,设置为BASIC或HEADERS,又无法打印我们关心的请求报文。
这种情况下,我们就需要重写logRequest和logAndRebufferResponse,按我们自定义的格式来打印我们关心的信息。
优点:只打印关心的信息;自定义打印格式。
public class FeignLogger extends Logger {
@Override
protected void logRequest(String configKey, Level logLevel, Request request) {
}
@Override
protected Response logAndRebufferResponse(String configKey,
Level logLevel,
Response response,
long elapsedTime)
throws IOException {
Request request = response.request();
String requestMsg = request.httpMethod().name() + " " + request.url() + " HTTP/1.1";
boolean hasReqBody = request.requestBody().asBytes() != null;
String bodyMsg = hasReqBody ? new String(request.requestBody().asBytes()) : "";
String responseMsg = "";
int status = response.status();
boolean hasResBody = response.body() != null && !(status == 204 || status == 205);
if (hasResBody) {
byte[] bodyData = Util.toByteArray(response.body().asInputStream());
response = response.toBuilder().body(bodyData).build();
responseMsg = decodeOrDefault(bodyData, UTF_8, "");
}
log(configKey, "request【%s】, body【%s】, response【%s】", requestMsg, bodyMsg, responseMsg);
return response;
}
@Override
protected void log(String configKey, String format, Object... args) {
log.info(String.format(methodTag(configKey) + format, args));
}
}
二、注册FeignLogger
FeignConfig类中增加
@Bean
public Logger logger() {
return new FeignLogger();
}
OK了,现在所有的feignclient都会按照我们自定义的格式来打印请求日志
更多推荐
所有评论(0)