Feign 配置全局日志存入mongo

1、开启feign日志

在application.yml 添加配置

feign:
  client:
    config:
      default:
        loggerLevel: FULL

2、日志实体类

@Document(collection = "feignLogs")
@Data
public class FeignLog {
    @Id
    private String id;
    private String method;
    private String url;
    private LocalDateTime requestTime;
    private String requestBody;
    private LocalDateTime responseTime;
    private String responseBody;
    private long elapsedTime;
    private int status;
}

3、定义一个 Spring Data MongoDB 存储库

public interface FeignLogRepository extends MongoRepository<FeignLog, String> {
}

自定义 Feign 日志记录器

import com.softding.dao.FeignLogRepository;
import com.softding.domain.log.FeignLog;
import feign.Logger;
import feign.Request;
import feign.Response;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;

@Slf4j
public class CustomFeignLogger extends Logger {

    private final FeignLogRepository feignLogRepository;

    public CustomFeignLogger(FeignLogRepository feignLogRepository) {
        this.feignLogRepository = feignLogRepository;
    }

    private FeignLog feignLog;

    @Override
    protected void log(String configKey, String format, Object... args) {
        log.info(String.format(methodTag(configKey) + format, args));
    }

    @Override
    protected void logRequest(String configKey, Level logLevel, Request request) {
        LocalDateTime requestTime = LocalDateTime.now();
        log.info("Request: {} {} {}", request.httpMethod(), request.url(), request.headers());
        log.info("Request Time: {}", requestTime);
        if (request.body() != null) {
            log.info("Request Body: {}", new String(request.body(), StandardCharsets.UTF_8));
        }

        FeignLog log = new FeignLog();
        log.setMethod(request.httpMethod().name());
        log.setUrl(request.url());
        log.setRequestTime(requestTime);
        log.setRequestBody(request.body() != null ? new String(request.body(), StandardCharsets.UTF_8) : null);
        feignLog = log;
        feignLogRepository.save(log);
    }

    @Override
    protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) throws IOException {
        LocalDateTime responseTime = LocalDateTime.now();
        log.info("Response: {} {} {}", response.status(), response.reason(), response.headers());
        log.info("Response Time: {}", responseTime);
        log.info("Elapsed Time: {} ms", elapsedTime);

        byte[] bodyData = response.body() != null ? IOUtils.toByteArray(response.body().asInputStream()) : null;
        if (bodyData != null) {
            log.info("Response Body: {}", new String(bodyData, StandardCharsets.UTF_8));
        }
        FeignLog log = null;
        if (feignLog != null) {
            log = feignLog;
        }else {
            log = new FeignLog();
        }
        log.setResponseTime(responseTime);
        log.setResponseBody(bodyData != null ? new String(bodyData, StandardCharsets.UTF_8) : null);
        log.setElapsedTime(elapsedTime);
        log.setStatus(response.status());

        feignLogRepository.save(log);

        return response.toBuilder().body(bodyData).build();
    }
}

4、配置使用自定义日志记录器

import com.softding.dao.FeignLogRepository;
import feign.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {

    @Autowired
    private FeignLogRepository feignLogRepository;
    @Bean
    Logger feignLogger() {
        return new CustomFeignLogger(feignLogRepository);
    }
}

效果展示
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值