feign如何开启日志及分析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: feign如何开启日志及分析

1、首先需要设置属性logging.level.包名:debug。为什么要打开这个属性呢?

因为feign的logger实现类Slf4jLogger在调用log方法时,会判断是否开启了debug。

protectedvoidlog(StringconfigKey, Stringformat, Object... args) {
// Not using SLF4J's support for parameterized messages (even though it would be more efficient)// because it would// require the incoming message formats to be SLF4J-specific.if (logger.isDebugEnabled()) {
logger.debug(String.format(methodTag(configKey) +format, args));
    }
}

2、feign的日志级别

feign的日志级别包含下面几个

  • NONE:不输出日志
  • BASIC:输出请求方法及url,响应的状态码及响应时间
  • HEADERS:输出请求和响应的头信息
  • FULL:输出请求和响应的请求头,消息体及元数据

在发送请求时,会判断feign的日志级别,如果级别大于等于HEADERS,则输出请求头,如果级别大于等于FULL,则输出消息体。

protectedvoidlogRequest(StringconfigKey, LevellogLevel, Requestrequest) {
log(configKey, "---> %s %s HTTP/1.1", request.httpMethod().name(), request.url());
if (logLevel.ordinal() >=Level.HEADERS.ordinal()) {
for (Stringfield : request.headers().keySet()) {
for (Stringvalue : valuesOrEmpty(request.headers(), field)) {
log(configKey, "%s: %s", field, value);
        }
      }
intbodyLength=0;
if (request.body() !=null) {
bodyLength=request.length();
if (logLevel.ordinal() >=Level.FULL.ordinal()) {
StringbodyText=request.charset() !=null?newString(request.body(), request.charset())
                  : null;
log(configKey, ""); // CRLFlog(configKey, "%s", bodyText!=null?bodyText : "Binary data");
        }
      }
log(configKey, "---> END HTTP (%s-byte body)", bodyLength);
    }
}

在feign处理响应时,AsyncResponseHandler处理响应时判断日志级别输出日志,请求头或者消息体。

protectedResponselogAndRebufferResponse(StringconfigKey,
LevellogLevel,
Responseresponse,
longelapsedTime)
throwsIOException {
Stringreason=response.reason() !=null&&logLevel.compareTo(Level.NONE) >0?" "+response.reason()
            : "";
intstatus=response.status();
log(configKey, "<--- HTTP/1.1 %s%s (%sms)", status, reason, elapsedTime);
if (logLevel.ordinal() >=Level.HEADERS.ordinal()) {
for (Stringfield : response.headers().keySet()) {
for (Stringvalue : valuesOrEmpty(response.headers(), field)) {
log(configKey, "%s: %s", field, value);
        }
      }
intbodyLength=0;
if (response.body() !=null&&!(status==204||status==205)) {
// HTTP 204 No Content "...response MUST NOT include a message-body"// HTTP 205 Reset Content "...response MUST NOT include an entity"if (logLevel.ordinal() >=Level.FULL.ordinal()) {
log(configKey, ""); // CRLF        }
byte[] bodyData=Util.toByteArray(response.body().asInputStream());
bodyLength=bodyData.length;
if (logLevel.ordinal() >=Level.FULL.ordinal() &&bodyLength>0) {
log(configKey, "%s", decodeOrDefault(bodyData, UTF_8, "Binary data"));
        }
log(configKey, "<--- END HTTP (%s-byte body)", bodyLength);
returnresponse.toBuilder().body(bodyData).build();
      } else {
log(configKey, "<--- END HTTP (%s-byte body)", bodyLength);
      }
    }
returnresponse;
}

3、如何设置日志级别的方式

3.1 通过属性配置

即feign.client.{contextId}.loggerLeve=BASIC、HEADERS或者FULL

可以发现在配置feign时,先是使用Configuration来配置,然后使用属性中的默认配置,最后使用属性中contextId对应的配置

protectedvoidconfigureFeign(FeignContextcontext, Feign.Builderbuilder) {
FeignClientPropertiesproperties=applicationContext            .getBean(FeignClientProperties.class);
FeignClientConfigurerfeignClientConfigurer=getOptional(context,
FeignClientConfigurer.class);
setInheritParentContext(feignClientConfigurer.inheritParentConfiguration());
if (properties!=null&&inheritParentContext) {
if (properties.isDefaultToProperties()) {
configureUsingConfiguration(context, builder);
configureUsingProperties(
properties.getConfig().get(properties.getDefaultConfig()),
builder);
configureUsingProperties(properties.getConfig().get(contextId), builder);
        }
else {
configureUsingProperties(
properties.getConfig().get(properties.getDefaultConfig()),
builder);
configureUsingProperties(properties.getConfig().get(contextId), builder);
configureUsingConfiguration(context, builder);
        }
    }
else {
configureUsingConfiguration(context, builder);
    }
}

3.2 @Configuration配置

@ConfigurationpublicclassFeignClientConfig {
@BeanLogger.LevelfeignLoggerLevel() {
returnLogger.Level.FULL;
    }
}

此时是通过父子BeanFactory中查找Logger.Level,因为在子BeanFactory中没有,实际上是在父BeanFactory查找得到Logger.Level。

3.3 @FeignClient注解中的configuration来指定配置类。

此时是通过在子BeanFactory中查找得到Logger.Level。

配置的优先级为从高到低

配置文件中的contextId对应的属性->配置文件中的default对应的属性->FeignClient注解通过configuration指定的配置类->全局配置

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
1月前
|
监控 安全 搜索推荐
使用EventLog Analyzer进行日志取证分析
EventLog Analyzer助力企业通过集中采集、归档与分析系统日志及syslog,快速构建“数字犯罪现场”,精准追溯安全事件根源。其强大搜索功能可秒级定位入侵时间、人员与路径,生成合规与取证报表,确保日志安全防篡改,大幅提升调查效率,为执法提供有力证据支持。
|
6月前
|
存储 运维 监控
SelectDB 实现日志高效存储与实时分析,完成任务可领取积分、餐具套装/水杯/帆布包!
SelectDB 实现日志高效存储与实时分析,完成任务可领取积分、餐具套装/水杯/帆布包!
|
6月前
|
SQL 监控 数据挖掘
SLS 重磅升级:超大规模数据实现完全精确分析
SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。
508 118
|
3月前
|
监控 安全 NoSQL
【DevOps】Logstash详解:高效日志管理与分析工具
Logstash是ELK Stack核心组件之一,具备强大的日志收集、处理与转发能力。它支持多种数据来源,提供灵活的过滤、转换机制,并可通过插件扩展功能,广泛应用于系统日志分析、性能优化及安全合规等领域,是现代日志管理的关键工具。
479 0
|
5月前
|
自然语言处理 监控 安全
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
阿里云可观测官方发布了Observable MCP Server,提供了一系列访问阿里云可观测各产品的工具能力,包含阿里云日志服务SLS、阿里云应用实时监控服务ARMS等,支持用户通过自然语言形式查询
578 0
阿里云发布可观测MCP!支持自然语言查询和分析多模态日志
|
4月前
|
人工智能 运维 监控
Aipy实战:分析apache2日志中的网站攻击痕迹
Apache2日志系统灵活且信息全面,但安全分析、实时分析和合规性审计存在较高技术门槛。为降低难度,可借助AI工具如aipy高效分析日志,快速发现攻击痕迹并提供反制措施。通过结合AI与学习技术知识,新手运维人员能更轻松掌握复杂日志分析任务,提升工作效率与技能水平。
|
7月前
|
存储 消息中间件 缓存
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
291 1
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
|
7月前
|
SQL 存储 自然语言处理
让跨 project 联查更轻松,SLS StoreView 查询和分析实践
让跨 project 联查更轻松,SLS StoreView 查询和分析实践
138 1
|
9月前
|
机器学习/深度学习 人工智能 运维
智能日志分析:用AI点亮运维的未来
智能日志分析:用AI点亮运维的未来
2774 15
|
9月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
384 7
MySQL事务日志-Undo Log工作原理分析

热门文章

最新文章

下一篇
oss教程