OpenFeign接口调用日志

news/2024/9/19 17:42:11/ 标签: OpenFeign, SpringCloud, SpringBoot

一、介绍

在开发或测试环境中,需要更多的调试信息;在通过 Spring Cloud OpenFeign 调用远程服务的接口时,可能需要记录接口调用的日志详情,比如:请求头、请求参数、响应等。

Spring Cloud OpenFeign 打印 FeignClient 的接口调用日志,可以通过 配置OpenFeign日志级别 来实现。OpenFeign 提供了不同的日志级别来控制日志输出的详细程度。

请注意:需要同时配置 应用日志级别DEBUGOpenFeign的接口调用日志才能正常打印。

二、接口日志示例

OpenFeign 打印接口调用日志示例(FULL日志级别):

在这里插入图片描述

OpenFeign_14">三、OpenFeign日志级别

OpenFeign 支持四种日志级别,分别是:

  1. NONE:不记录任何日志(默认值)。
  2. BASIC:仅记录请求方法和URL以及响应状态码和执行时间。
  3. HEADERS:除了 BASIC 级别的信息,还会记录请求和响应的头信息。
  4. FULL:最详细的日志级别,会记录请求和响应的头信息、正文和元数据。

四、配置文件

配置示例

可以通过配置文件(如 application.propertiesapplication.yml)来设置 OpenFeign 的日志级别和应用的日志级别。

spring:cloud:openfeign:client:config:default:loggerLevel: FULLlogging:level:com.example.hello_feign_client.feign.client: debug
#    com.example.hello_feign_client.feign.client.UserFeignClient: debug

配置分析

OpenFeign__45">OpenFeign 日志级别配置

spring:cloud:openfeign:client:config:default:loggerLevel: FULL

这部分配置指定了默认情况下 OpenFeign 客户端的日志记录级别。loggerLevel 设置为 FULL 意味着将记录完整的请求和响应细节,包括 headers 和 body。

应用日志级别设置

logging:level:com.example.hello_feign_client.feign.client: debug
#    com.example.hello_feign_client.feign.client.UserFeignClient: debug

这部分配置是针对应用的日志记录级别的设置。这里设置了包 com.example.hello_feign_client.feign.client 下的所有类的日志级别为 debug。注释掉的那一行是为特定的 Feign 客户端 UserFeignClient 设置日志级别为 debug。如果需要为特定的 Feign 客户端设置日志级别,可以取消注释并进行相应的设置。

debug 级别意味着将记录详细的调试信息,这对于开发阶段的错误排查非常有用。

需要注意的是,Spring Cloud OpenFeignloggerLevel 和日志框架(如 Logback, Log4j)的日志级别是分开的。前者控制 OpenFeign 如何记录其内部的调用细节,而后者则控制整个应用程序的日志输出级别。两者可以同时配置以达到更精细的日志管理。

五、全局默认和指定服务

全局默认

在 Spring Cloud OpenFeign 的配置中,default 是一个特殊的配置项名称,用来指定全局默认的配置选项。当您配置了一个名为 default 的项时,它会应用于所有未单独配置的 Feign 客户端。

具体来说,在以下配置中:

spring:cloud:openfeign:client:config:default:loggerLevel: FULL

default 项内的配置(在这个例子中是 loggerLevel: FULL)会被应用到所有没有显式指定配置的 Feign 客户端上。这意味着,如果您没有为某个特定的 Feign 客户端提供单独的日志级别配置,那么这个客户端将会使用 FULL 级别的日志记录。

指定服务

如果您有多个 Feign 客户端,并且想要为它们中的某些客户端指定不同的配置,您可以为这些特定的客户端提供独立的配置项,而不必使用 default。例如:

spring:cloud:openfeign:client:config:hello-feign-server:loggerLevel: BASICroleFeignClient:loggerLevel: HEADERSdefault:loggerLevel: FULL

在这个例子中,hello-feign-server 具有自己的日志级别配置,而任何其他未单独配置的 Feign 客户端都会使用 FULL 日志级别。这样就可以灵活地根据每个客户端的需求来调整配置。

在 Spring Cloud 的上下文中,hello-feign-server 是用来标识一个具体的 Feign 客户端的名称。当您创建一个 Feign 客户端时,您会通过 @FeignClient 注解来指定一个名称。例如:

@FeignClient(name = "hello-feign-server")
public interface UserFeignClient {// 定义方法...
}

在这个例子中,hello-feign-server 就是 Feign 客户端的名字,它可以在配置文件中作为键来指定该客户端的具体配置。

如果 FeignClient 配置了 contextId,此时 客户端名称 就不再是 服务名(name),而是 contextId 的值。

@FeignClient(contextId = "roleFeignClient", name = "hello-feign-server", path = "/roles")
public interface RoleFeignClient {// 定义方法...
}

六、不同级别日志的示例

在这里插入图片描述

OpenFeign_138">七、代码配置OpenFeign日志级别(不推荐)

实现方式:

package com.example.hello_feign_client.feign.config;import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignLogConfig {@BeanLogger.Level feignLoggerLeave() {return Logger.Level.FULL;}}

使用 Java 配置来设置 OpenFeign 的日志级别(如示例代码所示)虽然可行,但它并不是最推荐的方式,主要原因如下:

  1. 配置分离

    • 应用配置通常应该与业务逻辑分离。使用配置文件(如 application.propertiesapplication.yml)来管理配置信息更加灵活,易于维护,并且可以在不重新编译或不修改代码的情况下更改配置。
  2. 环境敏感性

    • 不同的环境可能需要不同的日志级别设置。例如,在生产环境中,您可能希望减少日志输出以提高性能,而在开发或测试环境中,则可能需要更多的调试信息。配置文件允许您根据环境的不同来轻松切换这些设置,而不需要修改代码。
  3. 可读性和可维护性

    • 使用配置文件来管理日志级别可以使配置更加清晰易读。将配置放在一个集中管理的地方也有助于避免将来可能出现的配置混乱问题。

尽管如此,在某些情况下,使用 Java 配置仍然是有效的解决方案,特别是在需要动态改变配置或者配置逻辑比较复杂的时候。但是,对于像设置日志级别这样相对简单和静态的配置,还是建议使用配置文件的方式。这不仅符合 Spring Boot 的最佳实践,也能更好地支持 DevOps 流程中的配置管理。


http://www.ppmy.cn/news/1527169.html

相关文章

达芬奇竖屏导出有黑屏解决方案

文章目录 项目设置导出设置 初学达芬奇,导出的时候,总是有黑边。 经过研究,才发现导出的时候的分辨率和项目分辨率 2个地方都要设置,否则导出就会导致有黑边。 项目设置 点击 文件 选择项目设置 选择竖屏分辨率 导出设置

C++ MFC SnowWorld

目录 效果 项目 代码 下载 效果 SnowWorld 项目 代码 // ChildView.cpp : implementation of the CChildView class // #include "stdafx.h" #include "SnowWorld.h" #include "ChildView.h" #ifdef _DEBUG #define new DEBUG_NEW #und…

无人机之防风性能篇

无人机的防风性能是评价其在不同风力条件下稳定性和安全性的重要指标。以下是关于无人机防风性能的几个关键点: 一、防风性能的影响因素 机身设计与结构:无人机的机身设计、材料选择以及结构强度直接影响其防风性能。例如,采用坚固耐用的材…

【笔记】1.3 二极管应用电路举例

文章目录 一、二极管的近似模型1、理想模型2、恒压降模型3、折线模型二、二极管的基本应用电路(主要涉及二极管的导通与否对电路的影响)1、开关电路(1)单管(2)多管优先导通原则:正向电压大的先导通。2、限幅电路单向限幅双向限幅一、二极管的近似模型 1、理想模型 就是…

图解Redis 01 | 初识Redis

什么是 Redis? Redis 是一种基于内存的数据库,所有的数据读写操作都在内存中完成,因此读写速度非常快。它被广泛应用于缓存、消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务需求,如 String、Hash、List、…

25. MyBatis中的RowBounds是什么?如何实现内存分页?

是 MyBatis 提供的一种用于结果集分页的功能,主要通过内存分页的方式实现。它通过在查询时传递分页参数,限制返回的结果集的大小。RowBounds 并不依赖于数据库层的分页功能,而是通过 MyBatis 在内存中对结果集进行截取,从而实现分…

中国计算机学会(CCF)推荐中文科技期刊目录(2019年)

推荐期刊害死人 ### A 类 | 序号 | 期刊名称 | 主办单位 | 网址 | |------|--------------------------|------------------------------------|-----------------------------------| | 1 | 软…

【Python机器学习】序列到序列建模——实际应用

序列到序列网络非常适合所有具有可变长度输入序列或可变长度输出序列的机器学习应用。由于自然语言的词序列几乎总是有不可预测的长度,因此序列到序列模型可以提高大多数机器学习模型的精确率。 目前序列到序列结构的主要应用有: 聊天机器人对话&#…

TensorRT-LLM——优化大型语言模型推理以实现最大性能的综合指南

引言 随着对大型语言模型 (LLM) 的需求不断增长,确保快速、高效和可扩展的推理变得比以往任何时候都更加重要。NVIDIA 的 TensorRT-LLM 通过提供一套专为 LLM 推理设计的强大工具和优化,TensorRT-LLM 可以应对这一挑战。TensorRT-LLM 提供了一系列令人印…

day22JS-npm中的部分插件使用方法

1. 静态资源目录 静态资源目录就是访问服务器的某些路劲时候,服务器可以吐出一个写好的指定页面。 实现思路: 1、先判断要找的路径是否是文件,如果是文件,就加载发给对方。 2、如果是文件夹,找到这个文件夹所在路径中…

用户体验在网站建设中的重要性

用户体验在网站建设中的重要性不言而喻。以下是对其重要性的具体介绍: 提升用户满意度:用户体验的优劣直接关系到用户对网站的满意程度。一个设计良好、易于导航、响应迅速的网站能够让用户在使用过程中感到舒适和愉悦,从而增加用户对网站的…

人工智能物联网的去中心化和分布式学习:全面综述、新兴挑战和机遇

这篇论文的标题是《Decentralized and Distributed Learning for AIoT: A Comprehensive Review, Emerging Challenges, and Opportunities》,作者是Hanyue Xu, Kah Phooi Seng, Li Minn Ang, 和 Jeremy Smith。论文发表在IEEE Access期刊上,接收日期为2…

Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)

参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、补充离散库和补充数学库中的模块概览 1、补充离散库 注:每个版本的补充离散库不一定相同,也不是每个版本的库都有如上所有模块。 2、补充数学库 二、离散直接传递函数Ⅱ模块 1、…

解决Tez报错问题

在启动hive的时候,发现该报错 1、检测HADOOP_PATH环境变量 echo $HADOOP_CLASSPATH 如果没有输出,说明我们的配置文件没有生效,这时候需要重写source一下 2、刷新配置文件生效 source /etc/profile 有输出,环境生效 3、再次运…

flink实战--如何基于java-agent技术增强Flink功能

Agent实现Flink流动数据的监听 一个Flink程序的运行,会依赖到一个或多个Connector(连接器),而这些连接器分为Source(主要用于读)和Sink(主要用于写),那么如果要监听到Flink作业流动的数据,我们这里可以简单尝试去查看支持Sink的Connector(例如:flink…

[docker]入门

本文章主要讲述的是,docker基本实现原理,docker概念的解释,docker的使用场景以及docker打包与部署的应用。 文章中docker所运行的系统:CentOS Linux release 7.9.2009 (Core) 目录 docker是什么,什么时候需要去使用 …

Postgresql导入sql文件数据

问题 经常有工友喊我导入一下sql到postgresql数据库中。今天就用命令行来导入sql数据。 步骤 # 使用postgres用户名&#xff0c;登录数据库 psql -U postgres postgres # 列出所有数据库 \l # 连接指定数据库 \c <数据库名> # 导入sql数据 \i <sql文件名>.sql #…

47.面向对象综合训练-汽车

//题目需求&#xff1a;定义数组存储3个汽车对象 //汽车的属性&#xff1a;品牌&#xff0c;价格&#xff0c;颜色 //创建三个汽车对象&#xff0c;数据通过键盘录入而来&#xff0c;并把数据存入到数组当中 1.标准的JavaBean类 public class Car {private String brand;//品…

Python数据分析案例59——基于图神经网络的反欺诈交易检测(GCN,GAT,GIN)

以前的数据分析案例的文章可以参考&#xff1a;数据分析案例 案例背景 以前二维的表格数据的机器学习模型都做烂了&#xff0c;[线性回归,惩罚回归,K近邻,决策树,随机森林,梯度提升,支持向量机,神经网络]&#xff0c;还有现在常用的XGBoost&#xff0c;lightgbm&#xff0c;ca…

Python画笔案例-052 绘制彩色递归六边形

1、绘制彩色递归六边形 通过 python 的turtle 库绘制 彩色递归六边形&#xff0c;如下图&#xff1a; 2、实现代码 绘制彩色递归六边形&#xff0c;以下为实现代码&#xff1a; """彩色递归六边形.py """ import turtledef draw_circle(radius,…