真香!被阿里老兄安利了一个轻量级的日志追踪框架。10 分钟即可接入!
开始文章之前,且听我简单BB几句。
国产开源之路不易,好的国产开源项目还是太少太少了。国内一些用心做开源的技术人基本都是靠爱发电。
今天介绍的这个日志框架的作者自己维护了 3 个开源框架,为此他经常忙到凌晨1,2点。目前,这个日志框架目前仍在开发中。不得不说的是!这个项目整体的代码质量很高,非常值得小伙伴们学习一波!
前言
随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候。因为业务链路贯穿着很多不同微服务,同一个微服务又可能部署着十几个节点,要排查某一个请求的日志,总不见得一个个节点搜过去吧,所以这时候日志的链路追踪就显得很有必要了。
很多公司可能自己搭了 ELK 或者使用了一些云产品的日志服务,但是它们只解决了日志的收集和展现,并没有提供日志的链路追踪。
也有公司上 SkyWalking,Pinpoint 等分布式追踪系统来解决,基于 OpenTracing 规范,而且通常都是无侵入性的,提供探针来收集发送日志,并且有相对友好的展示界面来进行链路的查询。
分布式追踪系统固然是一个比较完善的解决方案,但是熟悉以及推广到全公司的系统需要一定的时间周期,而且当中涉及到链路 span 节点的存储成本问题,全量采集还是部分采集?如果全量采集,就以 SkyWalking 的存储来举例,ES 集群搭建至少需要 5 个节点。这就需要增加服务器成本。况且如果微服务节点多的话,一天下来产生几十 G 上百 G 的数据其实非常正常。如果想保存时间长点的话,也需要增加服务器磁盘的成本。
有没有一种快速低成本来解决日志追踪问题方案呢?
我发现了最近在 Gitee 上比较火的开源项目 TLog,这是一款主打轻量级的日志追踪框架,号称 10 分钟就可以接入你的系统,支持主流的 dubbo,dubbox,openfeign 等 rpc 框架,自动适配 logback,log4j,log4j2 等日志框架。目前该项目入选了Gitee 2020 年的 GVP。
项目地址为:https://gitee.com/bryan31/TLog
特点
TLog 提供了一种最简单的方式来解决日志追踪问题,它不收集日志,也不需要额外的存储空间,它只是自动的对你的日志进行打标签,生成一系列的追踪信息的标签融入到你的日志里。这些标签能够有效的获知一条日志属于哪一个调用链,在某个调用链里属于哪一个层次,以及服务的上游信息。
TLog 的官网罗列了以下特性:
通过对日志打标签完成轻量级微服务日志追踪 提供三种接入方式:javaagent 完全无侵入接入;2.字节码一行代码接入;3.基于配置文件的接入 对业务代码无侵入式设计,使用简单,10 分钟即可接入 支持常见的 log4j,log4j2,logback 三大日志框架,并提供自动检测,完成适配 支持 dubbo,dubbox,springcloud 三大 RPC 框架 支持日志标签的自定义模板的配置,提供多个系统级埋点标签的选择 支持异步线程的追踪,包括线程池,多级异步线程等场景 几乎无性能损耗,快速稳定
接入
TLog 主打轻量级和易用性,在接入层面,TLog 提供了探针模式,字节码模式和适配模式。官网提供了一张表供你选择最适合的接入方式:
探针模式(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>
然后启动类中加入字节码增强的一句代码:
日志框架适配方式
侵入你所使用的日志框架配置文件,可以自动探测你所使用的 RPC 框架
每种日志框架有不同的配置方式,官网文档写的很详细,这里就不展开说明了。
日志标签
TLog 的核心就是标签,通过对普通的日志追加标签来获得服务追踪信息。
TLog 的标签分内置标签和自定义标签两种,下面就来说说这 2 种标签的定义。
内置标签
TLog 内置有 4 个标签可供选择:preApp,preIp,spanId,traceId
preApp 和 preIp 是上游服务的名称和 IP,其中 traceId 最为关键,这就是贯穿整条链路的追踪号,可以用来追溯某个业务请求。
spanId 是能展示这条日志在调用链中的层次关系。我们假设一次分布式调用中产生的 TraceId 是 0a1234
(实际不会这么短),那么根据上文 SpanId 的产生过程,有下图:
显而易见,如果把一次调用中的 spanId 全部收集起来,是可以很容易组成一棵调用树的。
TLog 默认只展示spanId
和traceId
两个内置标签,但是你可以在 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 允许用户对某一个方法内的日志加入特定的自定义标签。
平时做项目中有的童鞋喜欢在每条日志上打个订单号,以便方便搜索,类似这样的操作以后就可以轻松的用这个特性来解决啦!
当然对于@TLogAspect
标签而言,支持的特性有很多,不仅支持基本类型,也支持对象类型的属性取值,同时支持模板设定,自定义转换器等等。详细用法请看官方文档。
其他细节
TLog 在其他细节部分也作了一些支持。
所有的标签显示模板和显示在日志条目中的位置,都是可以自由配置的。
对异步子线程以及线程池中的场景,标签的信息依旧不会丢失。
以上的案例都是针对于 springboot 的,TLog 同时提供了 springboot 和非 springboot 两种版本,以方便更多不同种类的项目的接入。
具体支持部分也请移步 TLog 的官方文档。
最佳实践
TLog 的亮点就是轻量,接入快,适配流行的 rpc 和日志框架也比较全。但是看下来,因为不作日志收集,只是加入追踪信息。虽然从信息角度来说可追踪了。但是实际追踪起来还是不方便。
个人认为 ELK+TLog 或者 云日志产品+TLog 是一个不错的选择。ELK 或者云日志产品负责收集,TLog 负责加入追踪信息,这样就可以互相弥补。成为一套完整的追踪体系。
同时 TLog 作者也表示,未来的的蓝图是做成日志领域集收集,追踪,统计,分析,展现于一体日志中间件。现在目前还在不停迭代中。
最后的思考
在日志追踪领域,TLog 这个开源作品给我们展示了一种简约但又有效的方案,虽然它目前还不提供收集统计和 UI 展现,但是在易用性方面确实下了一番功夫。希望随着这个项目慢慢的迭代,能给开源社区带来更加丰富的特性。
最终再次附上 TLog 的项目托管地址,官网也在里面有连接
https://gitee.com/bryan31/TLog
最近写的一些干货,每篇都很用心,欢迎各位小伙伴阅读/点赞/分享:
我是Guide哥,Java后端开发,会一点前端知识,喜欢烹饪,自由的少年。一个三观比主角还正的技术人。我们下期再见!