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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 现实系统往往有着较高的复杂度。借助Trace、Log、Metric三驾马车,我们的系统具备了一定的可观测性。但观测位置和信息往往是固定的,而我们所遇到的问题常常是意料之外的。这就导致我们能够定位问题的范围难以更进一步。这时,我们需要在我们想要的位置采集信息,而在日常实践中,这就意味着我们需要添加日志...

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

动态日志打印

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

微信文章.png

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

image.png

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

image.png image.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都是我们自身的业务逻辑方法,也是我们需要关注的方法。接下来,我们可以继续借助日志治理的能力,去获取这些方法的现场信息,比如参数、返回值、类加载器等等。

com.alibabacloud.mse.demo.service.DruidCon.doCommond为例,我们只需要增加一条新的规则,指定该自定义方法。

image.png

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

image.png

开启该规则后,可以看到系统帮助我们在 /home/admin/.opt/ArmsAgent/logs/mse-log-governance.log 日志文件中打印了JSON格式的日志信息,包含了我们所勾选的参数信息。

{
  "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"
}

以上只是简单的例子,但是能够由此发现,MSE为服务治理的日志治理功能能够帮助我们在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)image.png

  • 打开是否为Docker文件的开关。

  • 打开是否部署于K8s的开关。

  • 模式选择JSON模式。

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

查看日志

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

image.png

小结

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
19天前
|
Java Shell
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
34 1
|
2月前
|
机器学习/深度学习 存储 监控
Elasticsearch 在日志分析中的应用
【9月更文第2天】随着数字化转型的推进,日志数据的重要性日益凸显。日志不仅记录了系统的运行状态,还提供了宝贵的洞察,帮助企业改进产品质量、优化用户体验以及加强安全防护。Elasticsearch 作为一个分布式搜索和分析引擎,因其出色的性能和灵活性,成为了日志分析领域的首选工具之一。本文将探讨如何使用 Elasticsearch 作为日志分析平台的核心组件,并详细介绍 ELK(Elasticsearch, Logstash, Kibana)栈的搭建和配置流程。
209 4
|
3月前
|
Java API 开发者
你的应用是不是只有service_stdout.log?
本文记录了logback-spring.xml文件不生效问题的整体排查思路。
|
23天前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
35 1
|
2月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
41 2
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
Java应用结构规范问题之AllLoggers接口获取异常日志的Logger实例的问题如何解决
|
3月前
|
数据库 Java 监控
Struts 2 日志管理化身神秘魔法师,洞察应用运行乾坤,演绎奇幻篇章!
【8月更文挑战第31天】在软件开发中,了解应用运行状况至关重要。日志管理作为 Struts 2 应用的关键组件,记录着每个动作和决策,如同监控摄像头,帮助我们迅速定位问题、分析性能和使用情况,为优化提供依据。Struts 2 支持多种日志框架(如 Log4j、Logback),便于配置日志级别、格式和输出位置。通过在 Action 类中添加日志记录,我们能在开发过程中获取详细信息,及时发现并解决问题。合理配置日志不仅有助于调试,还能分析用户行为,提升应用性能和稳定性。
50 0