跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 轻量级的分布式日志追踪利器,十分钟即可接入,从此日志追踪无难事
未分類
11 9 月 2020

轻量级的分布式日志追踪利器,十分钟即可接入,从此日志追踪无难事

轻量级的分布式日志追踪利器,十分钟即可接入,从此日志追踪无难事

資深大佬 : bryan31 5

前言

随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候。因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难。

这时候很多童鞋会开始考虑上 SkyWalking,Pinpoint 等分布式追踪系统来解决,基于 OpenTracing 规范,而且通常都是无侵入性的,并且有相对友好的管理界面来进行链路 Span 的查询。

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

所以这次介绍的开源项目是 TLog,它的产生背景源于想做一个轻量级的日志追踪解决方案,覆盖目前流行的日志框架和 RPC 框架,让用户以最少的成本来接入以解决微服务体系中日志跟踪的痛点。

当然分布式追踪系统是一个最终的解决方案,如果您的公司已经上了分布式追踪系统,那 TLog 并不适用。

TLog 提供了一种最简单的方式来解决日志追踪问题,它不收集日志,也不需要另外的存储空间,它只是自动的对你的业务日志进行打标签,自动生成 TraceId 贯穿你微服务的一整条链路。并且提供上下游节点信息。适合中小型企业以及想快速解决日志追踪问题的公司项目使用。

为此我为了 TLog 适配了三大日志框架,支持自动检测适配。支持 dubbo,dubbox,spring cloud 三大 RPC 框架,更重要的是,你的项目接入 TLog,可能连十分钟就不需要 :)

TLog 项目以及特性

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

轻量级的分布式日志追踪利器,十分钟即可接入,从此日志追踪无难事

TLog 具有以下特性:

  • 通过对日志打标签完成轻量级微服务日志追踪
  • 对业务代码无侵入式设计,使用简单,10 分钟即可接入
  • 支持常见的 log4j,log4j2,logback 三大日志框架,并提供自动检测,完成适配
  • 支持 dubbo,dubbox,springcloud 三大 RPC 框架
  • 支持日志标签的自定义模板的配置
  • 几乎无性能损耗

如何快速接入

TLog 支持了 springboot 的自动装配,在 springboot 环境下,只需要以下两步就可以接入!

依赖

<dependency>   <groupId>com.yomahub</groupId>   <artifactId>tlog-all-spring-boot-starter</artifactId>   <version>1.0.0</version> </dependency> 

目前 jar 包已上传中央仓库,可以直接依赖到

日志框架适配

只需要在你的启动类中加入一行代码,即可以自动进行探测你项目所使用的 Log 框架,并进行增强,目前支持 log4j,log4j2,logback 三大日志框架。

@SpringBootApplication public class Runner {      static {AspectLogEnhance.enhance();}//进行日志增强,自动判断日志框架      public static void main(String[] args) {         SpringApplication.run(Runner.class, args);     } } 

需要注意的是,因为这里是用 javassit 实现,需要在 jvm 加载对应日志框架的类之前,进行字节码增强。所以这里用 static 块。但是在以下 2 种情况下这种一行自动适配的可能不会生效:

1.Springboot/Spring 的启动类加入 log 定义,这种情况不会生效,因为 classload 在加载 static 块之前已经把 log 日志框架加载了。

2.你是用 tomcat/jboss/jetty 等外置容器启动的(对于 springboot 内置容器无影响)

对于这 2 种情况,TLog 也提供了 3 大日志框架的单独适配,只要替换日志配置文件中的相应 layout 类就可以了,下文也会介绍到

RPC 框架的适配

在 Springboot 环境下,TLog 会自动探测你用的 RPC 框架,自动进行适配。

做完以上 2 步,就 ok 了,最终效果如下(这里以 dubbo+log4j 为例):

Consumer 端代码:

轻量级的分布式日志追踪利器,十分钟即可接入,从此日志追踪无难事

日志打印:

2020-09-16 18:12:56,748 [WARN] [TLOG]重新生成 traceId[7161457983341056]  >> com.yomahub.tlog.web.TLogWebInterceptor:39 2020-09-16 18:12:56,763 [INFO] <7161457983341056> logback-dubbox-consumer:invoke method sayHello,name=jack  >> com.yomahub.tlog.example.dubbox.controller.DemoController:22 2020-09-16 18:12:56,763 [INFO] <7161457983341056> 测试日志 aaaa  >> com.yomahub.tlog.example.dubbox.controller.DemoController:23 2020-09-16 18:12:56,763 [INFO] <7161457983341056> 测试日志 bbbb  >> com.yomahub.tlog.example.dubbox.controller.DemoController:24 

Provider 代码:

轻量级的分布式日志追踪利器,十分钟即可接入,从此日志追踪无难事

日志打印:

2020-09-16 18:12:56,854 [INFO] <7161457983341056> logback-dubbox-provider:invoke method sayHello,name=jack  >> com.yomahub.tlog.example.dubbo.service.impl.DemoServiceImpl:15 2020-09-16 18:12:56,854 [INFO] <7161457983341056> 测试日志 cccc  >> com.yomahub.tlog.example.dubbo.service.impl.DemoServiceImpl:16 2020-09-16 18:12:56,854 [INFO] <7161457983341056> 测试日志 dddd  >> com.yomahub.tlog.example.dubbo.service.impl.DemoServiceImpl:17 

可以看到,经过简单接入后,各个微服务之间每个请求有一个全局唯一的 traceId 贯穿其中,对所有的日志输出都能生效,这下定位某个请求的日志链就变得轻松了。

改变日志标签的格式

TLog 允许用户自定义日志标签的格式,TLog 默认只打出 traceId,以<$traceId>这种模板打出,当然你能自定义其模板。还能加入其它的标签头

你只需要在 springboot 的 application.properties 里如下定义,改变标签的格式,就能按照你定义模板进行打印

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

$preApp :上游微服务节点名称

$preIp:上游微服务的 IP 地址

$traceId:全局唯一跟踪 ID

Log 框架的单独适配

如果你的自动化日志探测失效或者你用的是外置容器,你需要针对你项目中的日志框架配置进行修改,修改方法也很简单。

Log4j 配置文件增强

只需要把layout的实现类换掉就可以了

每个公司的 Log4J 的模板大同小异,这里只给出 xml 的例子

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration>     <appender name="stdout" class="org.apache.log4j.ConsoleAppender">         <!--替换成 AspectLog4jPatternLayout-->         <layout class="com.yomahub.tlog.core.enhance.log4j.AspectLog4jPatternLayout">             <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %m  >> %c:%L%n"/>         </layout>     </appender>     <appender name="fileout" class="org.apache.log4j.DailyRollingFileAppender">         <param name="File" value="./logs/test.log"/>         <!--替换成 AspectLog4jPatternLayout-->         <layout class="com.yomahub.tlog.core.enhance.log4j.AspectLog4jPatternLayout">             <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%p] %m  >> %c:%L%n"/>         </layout>     </appender>     <root>         <priority value="info" />         <appender-ref ref="stdout"/>         <appender-ref ref="fileout"/>     </root> </log4j:configuration>  

Logback 的配置文件增强

换掉encoder的实现类或者换掉layout的实现类就可以了

以下给出 xml 示例:

<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false">     <property name="APP_NAME" value="logtest"/>     <property name="LOG_HOME" value="./logs" />     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">         <!--替换成 AspectLogbackEncoder-->   <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   </encoder>     </appender>     <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">         <File>${LOG_HOME}/${APP_NAME}.log</File>         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">             <FileNamePattern>${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.%i.log</FileNamePattern>             <MaxHistory>30</MaxHistory>             <maxFileSize>1000MB</maxFileSize>         </rollingPolicy>         <!--替换成 AspectLogbackEncoder-->         <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>         </encoder>     </appender>      <!-- 日志输出级别 -->     <root level="INFO">         <appender-ref ref="STDOUT" />         <appender-ref ref="FILE" />     </root> </configuration>  

Log4j2 的配置文件增强

log4J2 由于是通过插件形式实现的,log4J2 有自动扫描插件的功能。所以无需对配置文件做任何更改就能生效。

后语

TLog 本质上是一个日志框架,只不过具有了支持 RPC 框架的日志追踪功能。写框架大概肝了我一周的时间,力求做到一个最轻量级的日志追踪解决方案,让使用者能以最少的成本接入。TLog 不光支持 springboot,对非 springboot 项目也进行了支持,具体配置方法请到项目主页查看文档。

我还为 TLog 写了详细的示例项目,涵盖了所涉及几乎所有场景,具体示例项目地址也在项目主页。

轻量级的分布式日志追踪利器,十分钟即可接入,从此日志追踪无难事

如果你在项目中也碰到日志追踪困难的场景,不妨来试试 TLog 吧,希望这款开源框架能帮助到你,开源不易,如你喜欢,请帮忙 star,你的支持是我前进的最大动力。如你碰到任何疑问,也欢迎联系我。

关注作者

「元人部落」是一个坚持做原创的技术科技分享号,希望你能关注我,我每周会出一篇实用的原创技术文章,陪着你一起走,陪你一起成长。关注公众号回复tlog能加入群聊,我会耐心回答你的每一个使用中的问题,也会长期对这个项目进行长期维护和迭代。

轻量级的分布式日志追踪利器,十分钟即可接入,从此日志追踪无难事

大佬有話說 (1)

  • 資深大佬 : LouisGuo

    直接拉到最后,看到二维码。 满足

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具