本文主要是介绍TARS 染色日志|收集记录特定日志,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
作者|Eaton
导语|
记日志可以说是程序猿/媛日常开发中的家常便饭了。在日常业务场景中,经常需要分析特定用户的日志,一般的日志记录方式很难满足需求,有什么解决办法呢?TARS 框架中包含染色日志的功能,能够记录特定用户的日志,优雅地解决这一问题。本文将会介绍染色日志的原理和功能,以及如何在 TARS 中使用染色日志。
目录
- 背景
- 初识染色日志
- TARS 染色功能概述
- 染色日志初体验
- 主动打开染色日志
- 实例
- 被动打开染色日志
- 实例
- 添加特定逻辑
- 总结
背景
很多业务场景中,需要对特定用户的行为进行追踪,比如部分用户反馈服务有 BUG,需要排查,但发现只是个例,要单独找出这些用户的日志进行分析;又或是 APP 上线了一个新的功能,先对一部分用户开放进行测试,需要追踪这部分用户的行为等。
按照一般方式,要在已经记录的日志中检索这部分用户的日志。看起来挺简单,但是在微服务的大背景下,服务间调用关系复杂(如下图),日志分散在各个服务节点上。对于一次调用,需要先获取调用链,再找出具体服务调用的节点,然后从节点上获取日志,这个过程非常繁琐。
另外,日志的记录会消耗程序的性能,占用用户的计算资源。因此在正式环境中,日常业务都会控制日志打印的量,确保日志打印不影响用户服务。而在对特定用户行为进行分析时,往往需要记录额外的日志,才能满足分析等需求,直接增加日志的打印显然不太现实。
可见,传统的日志记录方式无法满足对特定用户行为的日志记录,染色日志就是来解决这一问题的。
初识染色日志
什么是染色日志呢?在一个调用链里面,标志出某个特定需求的过程,让整个调用链里的上下文信息一直被传输下去,就像一开始被标记染色一样,这种标记日志的方式,我们叫它染色日志。
简单来说,就是我们只想要某几个用户的日志信息,通过染色日志把这几个用户的日志另外打印一份,并收集在同一个地方,这样我们在一个地方就能查找到这些染色用户的日志。
我们可以用染色日志定位一些特定的位置,也可以定一些特定的逻辑。比如某微信用户反馈语音发送存在问题,通过对用户ID(微信号)进行染色,后端服务接收到染色用户的请求后,就会将该用户本次调用的处理过程日志打印出来,可以非常方便地获取我们需要的关键信息。除了打印日志,还可以通过染色执行特定逻辑,比如新上线一个功能,开放给一部分用户使用,通过染色,后端服务可以判断用户是否在测试名单中,再执行相应的服务逻辑。
TARS 染色功能概述
TARS 框架支持染色日志功能,可以在某服务某接口中对特定用户号码的消息进行染色,方便地实时察看该用户引起后续所有相关调用消息流的日志。下图为 TARS 中的染色流程
染色日志打开后,在业务中通过指定染色的 key
值,例如指定 QQ 号为 123456
的用户,后续该用户的请求都会在框架中被自动染色,并通过日志服务(tarslog)集中打印染色日志。
我们只需要到 tarslog
服务所在的服务器上查看相应的染色日志即可,具体的路径一般为
/usr/local/app/tars/remote_app_log/tars_dyeing/dyeing/
该目录下一般包含两种日志文件:染色的滚动日志和染色的按天日志,日志文件名格式分别为 tars_dyeing.dyeing_roll_yyyymmdd.log
, tars_dyeing.dyeing_day_yyyymmdd.log
,比如:
# 染色滚动日志
tars_dyeing.dyeing_roll_20201103.log
# 染色按天日志
tars_dyeing.dyeing_day_20201103.log
滚动日志是服务的本地日志,一般用于记录服务调试信息;按天日志是服务的远程日志,一般用于记录重要的业务信息。开启染色后,如果接收到染色的请求,两种日志都会额外打印一份到 tarslog,只记录染色请求打印的日志,每天保存一个文件。
关于滚动日志和按天日志的用法以及更多信息,可以看到官方文档中日志部分,这里不再赘述。
染色日志初体验
TARS 框架的染色日志有主动打开和被动打开两种方式。接下来让我们通过实例,了解如何通过这两种方式在 TARS 中使用染色日志。本章中使用的实例源码都可以在这里找到。
主动打开染色日志
主动打开,指的是在发起请求的客户端的业务代码中,主动打开框架的染色日志开关。具体流程如下:
- 在客户端程序适当的地方声明染色日志开关
tars::TarsDyeingSwitch
的对象。 - 调用该开关对象的
enableDyeing
方法即可打开染色日志。被调用的服务也会自动打开染色开关,并打印日志到 tarslog。如果该被调服务还要调用其他服务,则自动传递给下个服务。 - 在染色日志开关关闭前,客户端打印的所有日志和被调用的服务打印的日志,都会额外打印一份到日志服务
tarslog
。 - 客户端开关对象析构,染色日志关闭,后续的调用和日志打印不再生成染色日志。
下面,我们通过一个实例来了解如何在客户端(主调方)中主动打开染色日志。
实例
这里以 C++ 为例,按照刚才介绍的流程,开启染色日志并调用 TARS 服务。
在开始之前,我们需要先准备一个 TARS 服务,供之后的客户端调用,源码见 TestServer 源码。我们创建一个服务,应用名为 TestApp
,服务名 TestServer
,Obj
名为 Test
,Test.tars
文件中定义的接口如下
module TestApp
{interface Test
{int test(string id, out string output);
};};
TestImp.h
和 TestImp.cpp
中 test
接口的定义和实现如下
// TestImp.h
virtual int test(const std::string &id, std::string &output, tars::TarsCurrentPtr current);//TestImp.cpp
int TestImp::test(const std::string &id, std::string &output, tars::TarsCurrentPtr current)
{// 打印本地日志TLOGDEBUG(__FILE__ << "|" << __LINE__ << "|" << "id: " << id << endl);output =<
这篇关于TARS 染色日志|收集记录特定日志的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!