背景介绍
近期架构要修改spring cloud 的调用方式,将从前的RestTemplate改成openFeign方式,调用的公共包并未提供日志打印功能,所以需要自己实现一个自定义的服务调用日志
实现方法
1.实现FeignLoggerFactory
import feign.Logger;
import org.springframework.cloud.openfeign.FeignLoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CustomizationFeignLoggerFactory implements FeignLoggerFactory {
private Logger logger;
public CustomizationFeignLoggerFactory() {
}
public CustomizationFeignLoggerFactory(Logger logger) {
this.logger = logger;
}
//实现create方法 new自定义的CustomizationFeignLogger
@Override
public Logger create(Class<?> type) {
return this.logger != null ? this.logger : new CustomizationFeignLogger();
}
//开启openfeign的日志,因为要自定义所以只开启(最低级别)即可
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.BASIC;
}
}
2.创建openFeign的自定义日志类-CustomizationFeignLogger
import feign.Request;
import feign.Response;
import feign.Util;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import static feign.Util.UTF_8;
import static feign.Util.decodeOrDefault;
@Slf4j
public class CustomizationFeignLogger extends feign.Logger {
public CustomizationFeignLogger() {
}
@Override
protected void log(String configKey, String format, Object... args) {
}
//自定义请求日志
@Override
protected void logRequest(String configKey, Level logLevel, Request request) {
Request.HttpMethod httpMethod = request.httpMethod();
String url = request.url();
String param = " ";
if (request.body() != null) {
param = new String(request.body(), UTF_8);
}
log.info(configKey + "------> {} url:{}, param:{}", httpMethod, url, param);
}
//自定义响应日志
@Override
protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) throws IOException {
String result = "";
int status = response.status();
try {
if (response.body() != null) {
byte[] bodyData = Util.toByteArray(response.body().asInputStream());
result = decodeOrDefault(bodyData, UTF_8, "Binary data");
return response.toBuilder().body(bodyData).build();
}
return response;
} finally {
if (response.status() == 200) {
log.info(configKey + "<------ status:{}, result:{}, ElapsedTime:[{}ms]", status,result,elapsedTime);
} else {
log.error(configKey + "<------ status:{}, result:{}, ElapsedTime:[{}ms]",status, result,elapsedTime);
}
}
}
网友评论