TARS 染色日志|收集记录特定日志

2024-03-19 01:08

本文主要是介绍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 中使用染色日志。本章中使用的实例源码都可以在这里找到。

主动打开染色日志

主动打开,指的是在发起请求的客户端的业务代码中,主动打开框架的染色日志开关。具体流程如下:

  1. 在客户端程序适当的地方声明染色日志开关 tars::TarsDyeingSwitch 的对象。
  2. 调用该开关对象的 enableDyeing 方法即可打开染色日志。被调用的服务也会自动打开染色开关,并打印日志到 tarslog。如果该被调服务还要调用其他服务,则自动传递给下个服务。
  3. 在染色日志开关关闭前,客户端打印的所有日志和被调用的服务打印的日志,都会额外打印一份到日志服务 tarslog
  4. 客户端开关对象析构,染色日志关闭,后续的调用和日志打印不再生成染色日志。

下面,我们通过一个实例来了解如何在客户端(主调方)中主动打开染色日志。

实例

这里以 C++ 为例,按照刚才介绍的流程,开启染色日志并调用 TARS 服务。

在开始之前,我们需要先准备一个 TARS 服务,供之后的客户端调用,源码见 TestServer 源码。我们创建一个服务,应用名为 TestApp,服务名 TestServerObj 名为 TestTest.tars 文件中定义的接口如下

module TestApp
{interface Test
{int test(string id, out string output);
};};

TestImp.hTestImp.cpptest 接口的定义和实现如下

// 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 染色日志|收集记录特定日志的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824317

相关文章

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

JAVA Log 日志级别和使用配置示例

《JAVALog日志级别和使用配置示例》本文介绍了Java中主流的日志框架,包括Logback和Log4j2,并详细解释了日志级别及其使用场景,同时,还提供了配置示例和使用技巧,如正确的日志记录方... 目录一、主流日志框架1. Logback (推荐)2. Log4j23. SLF4J + Logback

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

GO语言zap日志库理解和使用方法示例

《GO语言zap日志库理解和使用方法示例》Zap是一个高性能、结构化日志库,专为Go语言设计,它由Uber开源,并且在Go社区中非常受欢迎,:本文主要介绍GO语言zap日志库理解和使用方法的相关资... 目录1. zap日志库介绍2.安装zap库3.配置日志记录器3.1 Logger3.2 Sugared

tomcat日志中文乱码问题及解决方案

《tomcat日志中文乱码问题及解决方案》文章主要介绍了在使用Tomcat时遇到的乱码问题及其解决方法,页面输出乱码可能由于server.xml配置、HTML标签、编程输出编码不一致引起,解决方法包括... 目录一、页面输出乱码1.server.XML配置未注明编码格式2.catalina.bawww.cp

Mysql利用binlog日志恢复数据实战案例

《Mysql利用binlog日志恢复数据实战案例》在MySQL中使用二进制日志(binlog)恢复数据是一种常见的用于故障恢复或数据找回的方法,:本文主要介绍Mysql利用binlog日志恢复数据... 目录mysql binlog核心配置解析查看binlog日志核心配置项binlog核心配置说明查看当前所

Java 日志中 Marker 的使用示例详解

《Java日志中Marker的使用示例详解》Marker是SLF4J(以及Logback、Log4j2)提供的一个接口,它本质上是一个命名对象,你可以把它想象成一个可以附加到日志语句上的标签或戳... 目录什么是Marker?为什么使用Markejavascriptr?1. 精细化的过滤2. 触发特定操作3

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS