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

相关文章

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.