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);

}

}

从源码可以看出,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);
    }
}
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);
   }

}

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

日志级别

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

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

    private Level() {
   
   
    }
}

定制日志组件与日志级别

  • 针对单个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);
}
  • 针对全局Feign客户端
@Configuration
public class TestFeignClientConfiguration {
   
   

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

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

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

image.png

总结

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

image.png

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
3月前
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
684 56
|
9月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
1018 0
|
5月前
高性能网络库设计之日志组件
高性能网络库设计之日志组件
177 2
|
6月前
|
监控 安全 Linux
AWK在网络安全中的高效应用:从日志分析到威胁狩猎
本文深入探讨AWK在网络安全中的高效应用,涵盖日志分析、威胁狩猎及应急响应等场景。通过实战技巧,助力安全工程师将日志分析效率提升3倍以上,构建轻量级监控方案。文章详解AWK核心语法与网络安全专用技巧,如时间范围分析、多条件过滤和数据脱敏,并提供性能优化与工具集成方案。掌握AWK,让安全工作事半功倍!
196 0
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
616 136
|
9月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
232 3
|
10月前
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
1254 28
|
9月前
|
存储 监控 Java
G1原理—7.G1的GC日志分析解读
本文进行了TLAB的GC日志解读、YGC的GC日志解读、模拟YGC(单次GC及多次GC的不同场景)、打开实验选项查看YGC的详情日志信息、Mixed GC日志信息之初始标记过程、Mixed GC日志信息之混合回收过程。
|
11月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
543 7
MySQL事务日志-Undo Log工作原理分析
|
11月前
|
存储 人工智能 JSON
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
RAG Logger 是一款专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、检索结果记录、LLM 交互记录和性能监控等功能。
468 7
RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控

热门文章

最新文章