首页 > 其他分享 >Feign日志 - 自定义 info级别打印

Feign日志 - 自定义 info级别打印

时间:2024-04-15 11:24:03浏览次数:28  
标签:info Feign 自定义 feign configKey logger Logger

  1. 背景

    由于feign,默认只有debug的level,才能打印出日志。不太符合一般项目的log info level的约定。因此决定自定义feign的log打印。

  2. 目的

    在info level下,可以打印feign日志

  3. 寻找线索

    • 打开openfeign的核心包目录寻找log相关类
      feign-1.png
  • 通过FeignLoggerfactory的注释,可以看出此,接口是用来应用定制logger的接口

      feign-2.png
  • 此factory有一个default类DefaultFeignLoggerFactory,可以根据这个类找到实际的打印类

      feign-3.png
  • 可以坐在Slf4jLogger中发现,Feign只有在debug日志级别下才能打印的原因

      feign-4.png
  1. 开始编写

    • 步骤大概

      • 自定义实现FeignLoggerfactory此接口
      • 模仿DefaultFeignLoggerFactory
      • 模仿Slf4jLogger
      • 配置注入,并使其生效
    • 自定义实现FeignLoggerfactory此接口

      public class InfoFeignLoggerFactory implements FeignLoggerFactory {
          @Override
          public Logger create(Class<?> type) {
              return new InfoFeignLogger(LoggerFactory.getLogger(type));
          }
      }
      
    • 模仿Slf4jLogger,

      public class InfoFeignLogger extends Logger {
      
          private final org.slf4j.Logger logger;
      
          public InfoFeignLogger(org.slf4j.Logger logger) {
              this.logger = logger;
          }
      
          @Override
          protected void log(String configKey, String format, Object... args) {
            // info级别
              if (logger.isInfoEnabled()) {
                  this.logger.info(String.format(methodTag(configKey) + format, args));
              }
          }
      
          @Override
          protected void logRequest(String configKey, Level logLevel, Request request) {
            // info级别  
            if (this.logger.isInfoEnabled()) {
                  super.logRequest(configKey, logLevel, request);
              }
      
          }
      
          @Override
          protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) throws IOException {
            // info级别  
            return this.logger.isInfoEnabled() ? super.logAndRebufferResponse(configKey, logLevel, response, elapsedTime) : response;
          }
      }
      
    • 注入配置

      @Configuration
      public class FeignConfig {
      
          @Bean
          Logger.Level feignLevel() {
              return Logger.Level.FULL;
          }
      
          @Bean
          FeignLoggerFactory infoFeignLoggerFactory() {
              return new InfoFeignLoggerFactory();
          }
      }
      
    • 让custom的factory生效。找到FeignClientsConfiguration

        feign-5.png
 通过条件装配,当应用缺`FeignLoggerfactory`的实现的时候,才会加载default。因此我们自己编写的自定义factory会生效。
  1. 实现上述步骤,即可在info级别下,打印出日志


作者:鱼da王
链接:https://www.jianshu.com/p/615f23eba760
来源:简书

标签:info,Feign,自定义,feign,configKey,logger,Logger
From: https://www.cnblogs.com/xd502djj/p/18135547

相关文章

  • Entity Framework 自定义外键关系
    EntityFramework自定义外键关系在EntityFramework中,你可以通过在模型类中使用属性来定义自定义外键关系。以下是一个简单的例子,展示了如何在两个实体之间创建一对一的关联关系:  publicclassUser{publicintUserId{get;set;}publicstringUsername......
  • Redefine library-自定义函数库
    1.jjVolcano_Redefinelibrary(scRNAtoolVis)#jjVolcano只有9个颜色,Redefine到我的24个颜色,并与我umap中的分群颜色对应jjVolcano_Redefine<-function(diffData=NULL,myMarkers=NULL,order.by=c("avg_log2FC"),log2FC.cutoff=0.......
  • 实现自定义注解校验方法参数(AOP+自定义注解+自定义异常+全局异常捕获)
    一、实现目的在编写接口的时候,通常会先对参数进行一次校验,这样业务逻辑代码就略显冗杂,如果可以把校验参数的代码进行统一管理,在方法或者属性上直接添加注解就可以实现参数的校验,就可以提升代码编写的效率。二、实现原理通过自定义注解,注解在入参VO的属性上,设定需要满足的条件,然......
  • Windows 自定义服务(Windows Service)管理
    Windows自定义服务(WindowsService)管理在Windows系统中,你可以使用sc.exe命令或者PowerShell来创建自定义服务。以下是两种方法:使用sc.exe命令:打开命令提示符(以管理员身份运行)。使用sc.exe命令创建服务,语法如下:sccreate<ServiceName>binPath="<PathtoE......
  • Ant - Form 自定义组件 form.getFiledsValue 如何获取值
    import{FC,useState}from'react';importtype{SelectProps}from'antd';import{Select,Space,Flex,Input,Button}from'antd';/***扩展选择器组件,可以通过键盘enter输入一个Option*/constInputSelect:FC<{defaultOptio......
  • C语言10-指针(多级指针、空指针、野指针),自定义数据类型(枚举enum、结构体struct)
    第12章指针pointer12.6多级指针指向指针的指针称为多级指针eg:int*ptr1=&num; int**ptr2=&ptr1; int***ptr3=&ptr2;12.7空指针应用场景:1.暂时不确定指向的指针,可以在定义的时候先赋值为NULL2.有些指针函数,如果内部出现异常无法成功实现功能,可以返回NUL......
  • WPF自定义Window
    前言我们使用WPF开发客户端软件时,一般来讲都不会直接使用默认的Window样式,因为很难符合项目的风格,所以我们一般会自定义Window,一般有两种方式。WindowStyle=None和自定义Window,本文主要介绍第二种。一、WindowStyle=NoneWindowStyle="None"将Window的整个边框就去掉了,好处是......
  • docker network之 自定义网络(重点,多容器时都是使用这个)
    原来的默认使用bridge模式,创建好容器以后,2个容器使用ip地址去ping对方的ip是ok的,但是按照容器的服务名字取ping就失败: 我们知道容器在重启后,ip是可能变化的。所以那总不可能按照ip去访问吧,最好是按照服务名去访问,那怎么处理呢,请看下方:dockernetworklsdockernetworkcrea......
  • SpringBoot starter 原理及如何自定义 starter
     前言项目的开发要求是不断进化的,而随着时间以及技术的推移,在项目中除了基本的编程语言外,还需要进行大量的应用服务整合。例如,在项目中使用MySQL数据库进行持久化存储,同时会利用Redis作为缓存存储,以及使用RocketMQ实现异构系统整合服务等。但在早先使用Spring开发的......
  • FeignClient的拦截器中RequestContextHolder.getRequestAttributes()值为null
    一、遇到问题在@FeignClient的拦截器中获取token,我首先获得RequestContextHolder.getRequestAttributes(),结果发现值为null。``二、资料查找内事不决问百度,感觉百度了一下,很快我发现其他人也有通用报null的问题,只是他们是出现在子线程中,所以我猜测@FeignClient调用的时候为异......