# 分布式日志标记追踪神器TLog

# 概述

随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候。因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难。
这时候很多童鞋会开始考虑上SkyWalking,Pinpoint等分布式追踪系统来解决,基于OpenTracing规范,而且通常都是无侵入性的,并且有相对友好的管理界面来进行链路Span的查询。
但是搭建分布式追踪系统,熟悉以及推广到全公司的系统需要一定的时间周期,而且当中涉及到链路span节点的存储成本问题,全量采集还是部分采集?
如果全量采集,就以SkyWalking的存储来举例,ES集群搭建至少需要5个节点。这就需要增加服务器成本。
况且如果微服务节点多的话,一天下来产生几十G上百G的数据其实非常正常。如果想保存时间长点的话,也需要增加服务器磁盘的成本。
当然分布式追踪系统是一个最终的解决方案,如果项目已经上了分布式追踪系统,那TLog并不适用。

# 架构图


# 特点

TLog 提供了一种最简单的方式来解决日志追踪问题,它不收集日志,也不需要额外的存储空间,它只是自动的对你的日志进行打标签,生成一系列的追踪信息的标签融入到你的日志里。
这些标签能够有效的获知一条日志属于哪一个调用链,在某个调用链里属于哪一个层次,以及服务的上游信息。
TLog 的官网罗列了以下特性:
通过对日志打标签完成轻量级微服务日志追踪
提供三种接入方式:javaagent 完全无侵入接入;2.字节码一行代码接入;3.基于配置文件的接入
对业务代码无侵入式设计,使用简单,10 分钟即可接入
支持常见的 log4j,log4j2,logback 三大日志框架,并提供自动检测,完成适配
支持 dubbo,dubbox,springcloud 三大 RPC 框架
支持日志标签的自定义模板的配置,提供多个系统级埋点标签的选择
支持异步线程的追踪,包括线程池,多级异步线程等场景
几乎无性能损耗,快速稳定

# 接入

TLog 主打轻量级和易用性,在接入层面,TLog 提供了探针模式,字节码模式和适配模式。官网提供了一张表供你选择最适合的接入方式:。

# 接入方式


# 日志标签

TLog 的核心就是标签,通过对普通的日志追加标签来获得服务追踪信息。
TLog 的标签分内置标签和自定义标签两种,下面就来说说这 2 种标签的定义。
TLog 主打轻量级和易用性,在接入层面,TLog 提供了探针模式,字节码模式和适配模式。
官网提供了一张表供你选择最适合的接入方式:。

# 内置标签

TLog 内置有 4 个标签可供选择:preApp,preIp,spanId,traceId
preApp 和 preIp 是上游服务的名称和 IP,其中 traceId 最为关键,这就是贯穿整条链路的追踪号,可以用来追溯某个业务请求。

# 业务标签

TLog 允许用户对某一个方法内的日志加入特定的自定义标签。
平时做项目中有的童鞋喜欢在每条日志上打个订单号,以便方便搜索,类似这样的操作以后就可以轻松的用这个特性来解决啦!
当然对于@TLogAspect标签而言,支持的特性有很多,不仅支持基本类型,也支持对象类型的属性取值,同时支持模板设定,自定义转换器等等。详细用法请看官方文档。

在你的方法上加上@TLogAspect标注。简单的例子如下

# TLogAspect 支持多种写法 自行查阅具体解释

@TLogAspect({"id","name"})
@TLogAspect(value = {"id","name"},pattern = "<-{}->",joint = "_")
@TLogAspect(str = "XYZ")
@TLogAspect({"person.id","person.age","person.company.department.dptId"})
@TLogAspect(convert = CustomAspectLogConvert.class)
1
2
3
4
5

# 云药店工程适配

# pom.xml 增加配置

<dependency>
  <groupId>com.yomahub</groupId>
  <artifactId>tlog-all-spring-boot-starter</artifactId>
  <version>1.5.1</version>
</dependency>
1
2
3
4
5

# logback.xml修改encoder

encoder 标签修改为如下
<encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
1
2

# nacos yml 增加配置

tlog:
  pattern: "[$preApp][$preIp][$spanId][$traceId]"
1
2

# 效果截图