真香!被阿里老兄安利了一个轻量级的日志追踪框架。10 分钟即可接入!

JavaGuide

共 3972字,需浏览 8分钟

 ·

2020-11-13 16:30

开始文章之前,且听我简单BB几句。

国产开源之路不易,好的国产开源项目还是太少太少了。国内一些用心做开源的技术人基本都是靠爱发电。

今天介绍的这个日志框架的作者自己维护了 3 个开源框架,为此他经常忙到凌晨1,2点。目前,这个日志框架目前仍在开发中。不得不说的是!这个项目整体的代码质量很高,非常值得小伙伴们学习一波!

前言

随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候。因为业务链路贯穿着很多不同微服务,同一个微服务又可能部署着十几个节点,要排查某一个请求的日志,总不见得一个个节点搜过去吧,所以这时候日志的链路追踪就显得很有必要了。

很多公司可能自己搭了 ELK 或者使用了一些云产品的日志服务,但是它们只解决了日志的收集和展现,并没有提供日志的链路追踪。

也有公司上 SkyWalkingPinpoint 等分布式追踪系统来解决,基于 OpenTracing 规范,而且通常都是无侵入性的,提供探针来收集发送日志,并且有相对友好的展示界面来进行链路的查询。

分布式追踪系统固然是一个比较完善的解决方案,但是熟悉以及推广到全公司的系统需要一定的时间周期,而且当中涉及到链路 span 节点的存储成本问题,全量采集还是部分采集?如果全量采集,就以 SkyWalking 的存储来举例,ES 集群搭建至少需要 5 个节点。这就需要增加服务器成本。况且如果微服务节点多的话,一天下来产生几十 G 上百 G 的数据其实非常正常。如果想保存时间长点的话,也需要增加服务器磁盘的成本。

有没有一种快速低成本来解决日志追踪问题方案呢?

我发现了最近在 Gitee 上比较火的开源项目 TLog,这是一款主打轻量级的日志追踪框架,号称 10 分钟就可以接入你的系统,支持主流的 dubbodubboxopenfeign 等 rpc 框架,自动适配 logbacklog4jlog4j2 等日志框架。目前该项目入选了Gitee 2020 年的 GVP。

项目地址为:https://gitee.com/bryan31/TLog

1

特点

TLog 提供了一种最简单的方式来解决日志追踪问题,它不收集日志,也不需要额外的存储空间,它只是自动的对你的日志进行打标签,生成一系列的追踪信息的标签融入到你的日志里。这些标签能够有效的获知一条日志属于哪一个调用链,在某个调用链里属于哪一个层次,以及服务的上游信息。

TLog 的官网罗列了以下特性:

  • 通过对日志打标签完成轻量级微服务日志追踪
  • 提供三种接入方式:javaagent 完全无侵入接入;2.字节码一行代码接入;3.基于配置文件的接入
  • 对业务代码无侵入式设计,使用简单,10 分钟即可接入
  • 支持常见的 log4j,log4j2,logback 三大日志框架,并提供自动检测,完成适配
  • 支持 dubbo,dubbox,springcloud 三大 RPC 框架
  • 支持日志标签的自定义模板的配置,提供多个系统级埋点标签的选择
  • 支持异步线程的追踪,包括线程池,多级异步线程等场景
  • 几乎无性能损耗,快速稳定

接入

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

2

探针模式(javaagent)

其实探针模式是完全不侵入系统的,可以探测你使用的 rpc 框架和日志框架进行自动适配

只需要在 jvm 启动参数上加入:-javaagent:/your_path/tlog-agent.jar 就可以了

字节码注入方式

侵入 pom 文件和启动类,也可以自动探测你使用的 rpc 框架和日志框架

加入依赖:

<dependency>
  <groupId>com.yomahubgroupId>
  <artifactId>tlog-all-spring-boot-starterartifactId>
  <version>1.1.5version>
dependency>

然后启动类中加入字节码增强的一句代码:

3

日志框架适配方式

侵入你所使用的日志框架配置文件,可以自动探测你所使用的 RPC 框架

每种日志框架有不同的配置方式,官网文档写的很详细,这里就不展开说明了。

日志标签

TLog 的核心就是标签,通过对普通的日志追加标签来获得服务追踪信息。

TLog 的标签分内置标签和自定义标签两种,下面就来说说这 2 种标签的定义。

内置标签

TLog 内置有 4 个标签可供选择:preApp,preIp,spanId,traceId

preApp 和 preIp 是上游服务的名称和 IP,其中 traceId 最为关键,这就是贯穿整条链路的追踪号,可以用来追溯某个业务请求。

spanId 是能展示这条日志在调用链中的层次关系。我们假设一次分布式调用中产生的 TraceId 是 0a1234(实际不会这么短),那么根据上文 SpanId 的产生过程,有下图:

4

显而易见,如果把一次调用中的 spanId 全部收集起来,是可以很容易组成一棵调用树的。

TLog 默认只展示spanIdtraceId两个内置标签,但是你可以在 springboot 的配置文件中加入

tlog.pattern=[$preApp][$preIp][$spanId][$traceId]

就可以获得如下的日志展示效果:

2020-11-08 01:34:41.421 [DubboServerHandler-thread-2] INFO  c.y.t.example.dubbo.service.impl.DemoServiceImpl - [demo-app][192.168.50.80][0.1][7457635127294656] logback-dubbox-provider:invoke method sayHello,name=jack
2020-11-08 01:34:41.422 [Thread-8] INFO  c.y.tlog.example.dubbo.service.impl.AsynDomain - [demo-app][192.168.50.80][0.1][7457635127294656] 这是异步方法哦
2020-11-08 01:34:41.423 [Thread-8] INFO  c.y.tlog.example.dubbo.service.impl.AsynDomain - [demo-app][192.168.50.80][0.1][7457635127294656] 异步方法开始
2020-11-08 01:34:41.423 [Thread-8] INFO  c.y.tlog.example.dubbo.service.impl.AsynDomain - [demo-app][192.168.50.80][0.1][7457635127294656] 异步方法结束

自定义标签

TLog 允许用户对某一个方法内的日志加入特定的自定义标签。

平时做项目中有的童鞋喜欢在每条日志上打个订单号,以便方便搜索,类似这样的操作以后就可以轻松的用这个特性来解决啦!

5

当然对于@TLogAspect标签而言,支持的特性有很多,不仅支持基本类型,也支持对象类型的属性取值,同时支持模板设定,自定义转换器等等。详细用法请看官方文档。

其他细节

TLog 在其他细节部分也作了一些支持。

所有的标签显示模板和显示在日志条目中的位置,都是可以自由配置的。

对异步子线程以及线程池中的场景,标签的信息依旧不会丢失。

以上的案例都是针对于 springboot 的,TLog 同时提供了 springboot 和非 springboot 两种版本,以方便更多不同种类的项目的接入。

具体支持部分也请移步 TLog 的官方文档。

最佳实践

TLog 的亮点就是轻量,接入快,适配流行的 rpc 和日志框架也比较全。但是看下来,因为不作日志收集,只是加入追踪信息。虽然从信息角度来说可追踪了。但是实际追踪起来还是不方便。

个人认为 ELK+TLog 或者 云日志产品+TLog 是一个不错的选择。ELK 或者云日志产品负责收集,TLog 负责加入追踪信息,这样就可以互相弥补。成为一套完整的追踪体系。

同时 TLog 作者也表示,未来的的蓝图是做成日志领域集收集,追踪,统计,分析,展现于一体日志中间件。现在目前还在不停迭代中。

最后的思考

在日志追踪领域,TLog 这个开源作品给我们展示了一种简约但又有效的方案,虽然它目前还不提供收集统计和 UI 展现,但是在易用性方面确实下了一番功夫。希望随着这个项目慢慢的迭代,能给开源社区带来更加丰富的特性。

最终再次附上 TLog 的项目托管地址,官网也在里面有连接

https://gitee.com/bryan31/TLog

最近写的一些干货,每篇都很用心,欢迎各位小伙伴阅读/点赞/分享:

  1. 怒肝1.3w+字给学姐讲明白计算机专业大学四年到底该学什么?

  2. Spring Boot搭建的一个在线文件预览系统!支持ppt、doc等多种类型文件预览

  3.  一份热乎的 SpringBoot 前后端分离后台管理系统分析!分模块开发、RBAC权限控制...

  4. 要想代码写的好,这几款IDEA插件你离不了!

  5. 系统设计面试题指北

  6.  大二逃课总结的1.2w字的计算机网络知识!扫盲!

  7.  不太喜欢“只要钱给够就行,我愿意加班”这句话

  8.  5分“白嫖”我使用Github 5 年总结的这些骚操作


我是Guide哥,Java后端开发,会一点前端知识,喜欢烹饪,自由的少年。一个三观比主角还正的技术人。我们下期再见!

浏览 77
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报