OpenFeign日志组件Logger原理与应用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 该文章详细解释了如何在OpenFeign中配置并使用请求和响应的GZIP压缩功能。

前言

前面已经分析了OpenFeign三个组件了

今天还是继续分析OpenFeign的组件,分布式rpc服务调用的日志信息是非常关键的,OpenFeign提供了Logger组件,通过Logger组件可以实现openfeign接口调用的日志的打印。

OpenFeign日志打印源码

OpenFeign如何打印日志的,我们可以看到OpenFeign执行请求主流程源码 位于feign.SynchronousMethodHandler#executeAndDecode

Object executeAndDecode(RequestTemplate template) throws Throwable {
   
   

Request request = targetRequest(template);

//打印请求日志

if (logLevel != Logger.Level.NONE) {
   
   

logger.logRequest(metadata.configKey(), logLevel, request);

}

Response response;

long start = System.nanoTime();

try {
   
   

response = client.execute(request, options);

} catch (IOException e) {
   
   

//异常日志打印

if (logLevel != Logger.Level.NONE) {
   
   

logger.logIOException(metadata.configKey(), logLevel, e, elapsedTime(start));

}

throw errorExecuting(request, e);

}

long elapsedTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);

boolean shouldClose = true;

try {
   
   

//日志打印响应

if (logLevel != Logger.Level.NONE) {
   
   

response = logger.logAndRebufferResponse(metadata.configKey(), logLevel, response, elapsedTime);

}

//相应解码

Object result = decode(response);

return result;

} catch (IOException e) {
   
   

//打印响应解码日志

if (logLevel != Logger.Level.NONE) {
   
   

logger.logIOException(metadata.configKey(), logLevel, e, elapsedTime);

}

throw errorReading(request, response, e);

}

}
AI 代码解读

从源码可以看出,OpenFeign分别在发起请求前使用Logger对象打印请求信息,发起请求后打印请求响应信息,响应解码的信息打印。

image.png

Logger抽象类定义好了打印日志的方法,同时OpenFeign给Logger抽象类提供了4个实现类。

image.png

由此可知,OpenFeign默认支持Slf4j,JavaLogger等日志组件。

OpenFeign默认使用Slf4j日志组件

我们在自动装配类FeignClientsConfiguration中,发现没有配置Logger的Bean实现。 只是配置了FeignLoggerFactory的Bean是DefaultFeignLoggerFactory

那么OpenFeign默认使用什么日志组件呢?通过feignLoggerFactory就可以看得出来。

@Configuration(
    proxyBeanMethods = false
)
public class FeignClientsConfiguration {
   
   

    @Autowired(required = false)
    private Logger logger;
    @Bean
    @ConditionalOnMissingBean(FeignLoggerFactory.class)
    public FeignLoggerFactory feignLoggerFactory() {
   
   
       return new DefaultFeignLoggerFactory(this.logger);
    }
}
AI 代码解读
public class DefaultFeignLoggerFactory implements FeignLoggerFactory {
   
   

   private Logger logger;

   public DefaultFeignLoggerFactory(Logger logger) {
   
   
      this.logger = logger;
   }

   @Override
   public Logger create(Class<?> type) {
   
   
      //logger为空,默认使用log4j
      return this.logger != null ? this.logger : new Slf4jLogger(type);
   }

}
AI 代码解读

由此可知OpenFeign默认使用Slf4j日志组件打印日志。

日志级别

在Logger抽象类的方法参数里,对request和response方法日志打印还支持日志Level,日志等级共有4个。

public static enum Level {
   
   
    NONE,//不打印
    BASIC, //打印基本信息
    HEADERS,//只打印头
    FULL; //全部打印

    private Level() {
   
   
    }
}
AI 代码解读

定制日志组件与日志级别

  • 针对单个Feign客户端
public class TestFeignClientConfiguration {
   
   

    @Bean
    public Logger logger() {
   
   
        return new Logger.JavaLogger();
    }

    @Bean 
    public Logger.Level level() {
   
   
        return  Logger.Level.FULL;
    }
}


@RestController
@FeignClient(value = "fox-server", configuration = TestFeignClientConfiguration.class)
public interface FeignService {
   
   
    @PostMapping("/get")
    String getName(@RequestBody @Validated DemoRequest request);
}
AI 代码解读
  • 针对全局Feign客户端
@Configuration
public class TestFeignClientConfiguration {
   
   

    @Bean
    public Logger logger() {
   
   
        return new Logger.JavaLogger();
    }

    @Bean 
    public Logger.Level level() {
   
   
        return  Logger.Level.FULL;
    }
}
AI 代码解读
  • 自定义日志组件

我们也可以自己实现自己的日志组件,只要继承抽象类feign.Logger,实现log方法,比如我们想把日志上报到kafka,提供给监控平台或者日志云平台分析等。

image.png

总结

OpenFeign日志组件实现还是比较简单的,她和其他OpenFeign组件一样提供了的扩展点,我们可以按需实现自己的日志组件,实现个性化的日志打印或者日志上报功能,你在生产环境有没有使用过OpenFeign日志组件呢?欢迎评论区留言分享讨论。

image.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
2
2
1
41
分享
相关文章
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
76 0
|
30天前
|
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
29 3
G1原理—7.G1的GC日志分析解读
本文进行了TLAB的GC日志解读、YGC的GC日志解读、模拟YGC(单次GC及多次GC的不同场景)、打开实验选项查看YGC的详情日志信息、Mixed GC日志信息之初始标记过程、Mixed GC日志信息之混合回收过程。
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
370 67
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
242 28
MySQL原理简介—7.redo日志的底层原理
本文介绍了MySQL中redo日志和undo日志的主要内容: 1. redo日志的意义:确保事务提交后数据不丢失,通过记录修改操作并在系统宕机后重做日志恢复数据。 2. redo日志文件构成:记录表空间号、数据页号、偏移量及修改内容。 3. redo日志写入机制:redo日志先写入Redo Log Buffer,再批量刷入磁盘文件,减少随机写以提高性能。 4. Redo Log Buffer解析:描述Redo Log Buffer的内存结构及刷盘时机,如事务提交、Buffer过半或后台线程定时刷新。 5. undo日志原理:用于事务回滚,记录插入、删除和更新前的数据状态,确保事务可完整回滚。
186 22
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
163 7
MySQL事务日志-Undo Log工作原理分析
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
145 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控

热门文章

最新文章

下一篇
oss创建bucket