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

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

  •  
  •   bryan31 Sep 17, 2020 2502 views
    This topic created in 2062 days ago, the information mentioned may be changed or developed.

    前言

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

    这时候很多童鞋会开始考虑上 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

    file

    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 端代码:

    file

    日志打印:

    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 代码:

    file

    日志打印:

    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.yoahub.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 写了详细的示例项目,涵盖了所涉及几乎所有场景,具体示例项目地址也在项目主页。

    file

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

    关注作者

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

    img

    1 replies    2020-09-18 08:58:37 +08:00
    LouisGuo
        1
    LouisGuo  
       Sep 18, 2020
    直接拉到最后,看到二维码。 满足
    About     Help     Advertise     Blog     API     FAQ     Solana     995 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 22:02 PVG 06:02 LAX 15:02 JFK 18:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86