期望:
输出自己想要的日志格式,包含请求参数,响应参数,响应时间,请求URL
处理方法:
1、打开日志
2、继承: feign.Logger
实现:logAndRebufferResponse
/**
*打开日志
*/
@Configuration
public class FeignLogConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
}
/**
*继承: feign.Logger
*实现:logAndRebufferResponse
**/
@Component
public class RemoteLogger extends Logger {
private static final PosLogger logger = new PosLogger(RemoteLogger.class);
@Override
protected void log(String s, String s1, Object... objects) {
}
@Override
protected void logRequest(String configKey, Logger.Level logLevel, Request request) {
}
@Override
protected Response logAndRebufferResponse(String configKey, Logger.Level logLevel, Response response, long elapsedTime) throws IOException {
if (response.body() != null) {
String result="";
byte[] bodyData = Util.toByteArray(response.body().asInputStream());
int bodyLength = bodyData.length;
if (bodyLength > 0) {
result = Util.decodeOrDefault(bodyData, Util.UTF_8, "Binary data");
}
Response build = response.toBuilder().body(bodyData).build();
Request request = build.request();
String bodyText = request.charset() != null ? new String(request.body(), request.charset()) : null;
// 请求URL request.url()
// 请求参数 bodyText
// 请求结果 result
// 请求耗时 elapsedTime
//logger.info();
return build;
}
return response;
}
protected IOException logIOException(String configKey,
Level logLevel,
IOException ioe,
long elapsedTime) {
//IOException 自带log输出即可 logger.error();
// com.netflix.client.ClientException: Load balancer does not have available server for client: lzh-cloud-test 服务没发现未进IO异常
return ioe;
}
}
日志级别:
NONE,无记录(DEFAULT)。
BASIC,只记录请求方法和URL以及响应状态代码和执行时间。
HEADERS,记录基本信息以及请求和响应标头。
FULL,记录请求和响应的头文件,正文和元数据。
特定类指定特定日志级别:
logging:
level:
com.lzh.cloud.feign.UserFeignClient: DEBUG
feign.Logger 源码简单解读
Logger
//构造方法
Logger();
//请求configKey长度处理
methodTag(String configKey);
//输出log日志
log(String var1, String var2, Object... var3);
//输出请求相关信息
logRequest(String configKey, Logger.Level logLevel, Request request)
//输出重试信息
logRetry(String configKey, Logger.Level logLevel)
//输出响应信息
logAndRebufferResponse(String configKey, Logger.Level logLevel, Response response, long elapsedTime)
//输出IO异常信息
logIOException(String configKey, Logger.Level logLevel, IOException ioe, long elapsedTime)
//默认的几个类实现
NoOpLogger
JavaLogger
ErrorLogger
//日志不同级别
Level
源码:
public abstract class Logger {