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

优采云 发布时间: 2022-10-30 17:19

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

  作者 | 玉山

  实际系统通常具有很高的复杂性。我们使用 Trace、Log、Metric 三驾马车,让我们的系统具备一定的可观测性,但是观测的位置和信息往往是固定的,遇到的问题往往是出乎意料的,导致我们能够定位问题的范围,但是很难更进一步,那么我们需要 采集 信息来帮助我们在我们想要的地方,这在通常的实践中意味着然后我们需要添加日志记录逻辑并重新启动应用程序,这很昂贵并失去了现场。借助日志管理,只需要在控制台中配置规则,即可动态采集任意点信息,无需重启应用。接下来,我们将通过一个假设的故障排除过程来简要介绍日志管理的实践。

  动态日志打印

  假设我们有一个简单的请求调用链接,用于请求数据库,如图所示。当调用链路的请求异常时,在定位问题的过程中,我们往往需要知道调用栈信息,然后查看栈上的Methods,获取这些方法的参数、返回值、异常等信息,从而帮助我们找出问题的原因。有了日志治理的能力,我们就可以轻松的进行这些操作。

  这种场景下,当发现AppB的/sql请求部分报错,但是我们还没有提前写出可以记录有效信息的日志,那么我们可以配置一个日志管理规则,打印现场栈信息来获取我们需要检查的方法列表,然后逐个方法进一步分析。我们选择 /sql 作为目标。如果不知道具体的界面,可以保持默认选择all。

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

  开启这条规则后,可以看到系统帮助我们打印日志文件中收录堆栈信息的日志:

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

  

  atcom.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:989)atcom.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:213)atcom.alibabacloud.mse.demo.service.DruidCon.doCommon( DruidCon.java:57)atcom.alibabacloud.mse.demo.service.DruidService.query(DruidService.java:15)atcom.alibabacloud.mse.demo.BApplication$AController.sql(BApplication.java:89)atsun.reflect。NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

  通过截取其中的一些,我们可以发现其中一些是我们自己的业务逻辑方法,也是我们需要关注的方法。我们可以继续使用日志管理的能力来获取这些方法的现场信息,比如参数、返回值、类加载器等等。

  自己的业务逻辑方法:

  com.alibabacloud.mse.demo.service.DruidCon.doCommon

  com.alibabacloud.mse.demo.service.DruidService.query

  以 doCommon 方法为例,我们只需要添加一个新的规则来指定自定义方法。

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

  开启这条规则后,可以看到系统帮我们打印了JSON格式的日志信息,包括我们检查的参数信息:

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

  {"appName":"app-b","attributes":{"mse.tag":"base","mse.param":"{\"sql\":\"select*fromlog_demowhereid=?\", \"id\":\"1\"}","mse.app.tag":"base","mse.service.type":"CUSTOM"},"endTime":28,"events":{ },"ip":"10.0.0.166","name":"com.alibabacloud.mse.demo.service.DruidCon:doCommon(java.lang.String,int)","needRecord":true,"parentId" :-46695586,"ruleIdSet":[288],"spanId":-86744300,"startTime":25,"statusCode":2,"traceId":"ea1a00009d231724d0001"}

  上面只是一个简单的例子,但是可以发现日志管理的能力让我们可以在Java方法中的任意点采集信息,将检查工作变成零代码和动态,因为不需要重复在测试环境中添加日志代码并不断重启应用,可以大大降低一些在测试环境中难以重现的问题的排查难度。

  

  日记采集

  开启日志管理功能后,我们的日志会自动滚动保存到本地。为了满足存储或者进一步分析的需要,我们可以将这些日志采集放到日志服务系统中。这里我们以 SLS 的 Logtail 采集 模式为例。

  配置Logtail 采集 日志

  通过组件或其他方式在我们的集群或实例中安装Logtail后,即可通过日志服务SLS控制台完成log采集的配置。具体请参考SLS日志服务的相关文档。. 我们只关注其中的一些配置,首先是Logtail配置。在K8s集群场景下,我们需要的配置如下:

  使用 OneAgent 时,日志路径为:

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

  二是查询分析配置。在控制台配置过程中,我们可以选择自动生成索引或稍后在 SLS 控制台中添加索引。为方便我们分析,建议对statusCode、ruleIdSet、name、appName等字段添加索引。

  查看日志

  一段时间后,可以在 SLS 控制台中查看采集的日志,并在查询分析的帮助下进行处理。

  概括

  借助现有的日志管理能力,我们可以动态采集任意点信息,无需重启应用。同时,由于日志管理在采集信息时会引入链接信息,分析起来比较复杂。调用问题时效果很好。目前日志管理的信息采集会以JSON格式存储在本地,我们可以使用SLS等日志服务系统提供的采集方法采集做进一步的查询分析,后续日志管理会不断完善和优化,采集的信息组织完全兼容OpenTelemetry标准,进一步提供符合标准的完整上报方式。

  正式推出:长尾关键词采集软件V1.0免费版

  长尾关键词泛采集软件是分析采集发布出现在中文搜索中的长尾关键词的强大工具,可以帮助用户广泛采集长尾词,内置三种引擎界面功能。支持一键导出为TXT文本。它是采集长尾关键词和相关单词的更好工具!

  采集软件 “src=”“ />

  软件说明数据

  来源于三大搜索引擎的官方数据,软件根据原关键词输入情况对相关长尾词进行多级挖掘(可输入多组)。

  使用说明

  

  输入关键词,采集相关的长尾词,长尾词

  的长尾词,等等。

  只需一关键词就可以无线采集到海里并腐烂。

  z博客发布:

  网址:

  用户名:管理员

  密码:管理员

  

  饼干:自己抓取它们

  Dedecms的发布

  网址: 9090/dede

  用户名:

  密码:

  饼干:抓取自己

  发布时登录,会自动获得相关栏目

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线