一、使用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都会按照我们自定义的格式来打印请求日志

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐