无需重启应用,动态采集任意点位日志

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
性能测试 PTS,5000VUM额度
简介: 借助日志治理的现有能力,我们能够在不重启应用的前提下,动态采集任意点位信息,同时由于日志治理在采集信息时会引入链路信息,在分析复杂调用问题时能够起到很好的效果。

作者: 屿山


现实系统往往有着较高的复杂度,我们借助 Trace、Log、Metric 三驾马车使我们的系统具备了一定的可观测性,但观测位置和信息往往是固定的,而我们所遇到的问题常常是意料之外的,这就导致我们能够定位问题的范围,但是难以更进一步,这时候我们就需要在我们想要的位置采集信息来帮助我们,在通常的实践中这就意味着我们需要添加日志逻辑并重启应用,这种做法成本较高而且会丢失现场。而借助日志治理,只需要通过在控制台配置规则便可以在不重启应用的前提下,动态采集任意点位信息。接下来通过一个假想的排查流程来简单介绍下日志治理的实践。


动态日志打印


假设我们有一条如图所示的简单的请求数据库的请求调用链路,当该调用链路的请求出现了异常,在定位问题的过程中,我们往往会需要知道调用的堆栈信息,进而去排查堆栈上的方法,获取这些方法的参数、返回值、异常等信息,从而帮助我们查清问题的原因。借助日志治理的能力,我们可以很方便地进行这些操作。


1.png


在这个场景下,当发现 AppB 的/sql 请求部分报错,但我们并没有预先编写能够记录有效信息的日志,这时我们就可以通过配置一条日志治理的规则来打印现场的堆栈信息,以获取我们需要排查的方法列表,再进一步对逐个方法进行分析。我们选择/sql 作为 Target,如果不知道具体的接口,也可以保持默认选择全部。


2.png


由于我们只需要分析错误的请求,所以在过滤规则条件中开启异常过滤,在打印内容中选中调用堆栈,其他的内容可以根据需要选择。


3.png

4.png


开启该规则后,可以看到系统帮助我们在日志文件中打印了包含堆栈信息的日志


/home/admin/.opt/ArmsAgent/logs/mse-log-governance.log


at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:989)
  at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:213)
  at com.alibabacloud.mse.demo.service.DruidCon.doCommond(DruidCon.java:57)
  at com.alibabacloud.mse.demo.service.DruidService.query(DruidService.java:15)
  at com.alibabacloud.mse.demo.BApplication$AController.sql(BApplication.java:89)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)


截取其中一部分可以发现其中有一部分是我们自身的业务逻辑方法,也是我们需要关注的方法,我们可以继续借助日志治理的能力,去获取这些方法的现场信息,比如参数、返回值、类加载器等等。


自身业务逻辑方法:
com.alibabacloud.mse.demo.service.DruidCon.doCommond com.alibabacloud.mse.demo.service.DruidService.query


以 doCommond 方法为例,我们只需要增加一条新的规则,指定该自定义方法。


7.png


随后在过滤规则条件中开启异常过滤,在打印内容中选中请求参数,其他的内容可以根据需要选择。


8.png


开启该规则后,可以看到系统帮助我们在打印了 JSON 格式的日志信息,包含了我们所勾选的参数信息:


/home/admin/.opt/ArmsAgent/logs/mse-log-governance.log


{
  "appName": "app-b",
  "attributes": {
    "mse.tag": "base",
    "mse.param": "{\"sql\":\"select * from log_demo where id = ?\",\"id\":\"1\"}",
    "mse.app.tag": "base",
    "mse.service.type": "CUSTOM"
  },
  "endTime": 1665974434728,
  "events": {},
  "ip": "10.0.0.166",
  "name": "com.alibabacloud.mse.demo.service.DruidCon:doCommond(java.lang.String,int)",
  "needRecord": true,
  "parentId": -4669550334584716586,
  "ruleIdSet": [
    288
  ],
  "spanId": -8047278153886744300,
  "startTime": 1665974434725,
  "statusCode": 2,
  "traceId": "ea1a00009d16659744347231724d0001"
}


以上只是简单的例子,但是能够由此发现,日志治理的能力能够让我们在 Java 方法任意点位收集信息,将排查工作变成零代码且动态的,由于不需要在测试环境中重复增加日志代码并不断重启应用,能够大大减小某些难以在测试环境中复现的问题的排查难度。


日志采集


在启用了日志治理功能之后,我们的日志会被自动滚动保存至本地,为了满足存储或是进一步分析的需求,我们可以将这些日志采集到日志服务系统中。这里以 SLS 的 Logtail 采集方式为例。


配置 Logtail 采集日志


在通过组件或是其他方式在我们的集群或是实例中安装了 Logtail 之后,可以通过日志服务 SLS 控制台来完成日志采集的配置,这部分内容可以详见 SLS 日志服务的相关文档。我们只关注其中的一些配置,首先是 Logtail 配置,在 K8s 集群场景下,我们所需要的配置如下:


  • 日志路径为:/home/admin/.opt/ArmsAgent/logs/mse-log-governance.log

使用 OneAgent 时,日志路径为:
/home/admin/.opt/ArmsAgent/plugins/ArmsAgent/logs/mse-log-governance.log

9.png


  • 打开是否为 Docker 文件的开关
  • 打开是否部署于 K8s 的开关
  • 模式选择 JSON 模式 


其次是查询分析配置,在控制台配置流程中,我们可以选择自动生成索引或是后续在 SLS 控制台中自行增加索引,为了方便我们的分析,statusCode、ruleIdSet、name、appName 等字段建议增加索引。


查看日志


稍等片刻后便可以在 SLS 控制台查看收集的日志,并借助查询分析功能处理日志。


10.png


小结


借助日志治理的现有能力,我们能够在不重启应用的前提下,动态采集任意点位信息,同时由于日志治理在采集信息时会引入链路信息,在分析复杂调用问题时能够起到很好的效果。目前日志治理采集的信息会以 JSON 格式的形式滚动存储在本地,我们可以借助 SLS 这类日志服务系统提供的采集方法采集并进行进一步的查询和分析,后续日志治理也会不断完善优化,采集的信息组织完全兼容 OpenTelemetry 标准,并进一步提供完善的符合标准的上报方式。


MSE 云原生网关预付费、MSE 注册配置预付费首购 8 折,首购 1 年及以上 7 折。点击此处,即享优惠!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14天前
创空间重启后出现log问题
日志问题;log问题
71 6
|
16天前
|
弹性计算 Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之集成sls时出现报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
29天前
|
SQL 分布式计算 监控
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
本文演示了使用 EMR Serverless Spark 产品搭建一个日志分析应用的全流程,包括数据开发和生产调度以及交互式查询等场景。
56438 7
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
|
7天前
|
SQL 监控 中间件
【应急响应】拒绝服务&钓鱼指南&DDOS压力测试&邮件反制分析&应用日志
【应急响应】拒绝服务&钓鱼指南&DDOS压力测试&邮件反制分析&应用日志
|
16天前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之sls日志告警调用函数计算,出现抛出的结果异常,是什么原因
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
Oracle 关系型数据库 数据库
实时计算 Flink版产品使用合集之采集Oracle数据库时,归档日志大小暴增的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
22天前
|
SQL 监控 关系型数据库
|
17天前
|
SQL 数据采集 DataWorks
DataWorks产品使用合集之pyodps的线程限制是什么意思
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
17天前
|
DataWorks 数据可视化 安全
DataWorks产品使用合集之SLS日志中新增了存在iotId这个字段,同步的时候怎么手动增加
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
22天前
|
SQL 关系型数据库 MySQL