美文网首页
自定义openfeign日志

自定义openfeign日志

作者: 抽筋的狗狗 | 来源:发表于2022-03-09 08:56 被阅读0次

背景介绍

近期架构要修改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);
            }
        }
    }

日志打印效果

image.png

相关文章

网友评论

      本文标题:自定义openfeign日志

      本文链接:https://www.haomeiwen.com/subject/juxtdrtx.html