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

前言

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

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

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

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

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

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

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

TLog项目以及特性

项目地址:gitee.com/bryan31/TLo…

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

TLog具有以下特性:

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

如何快速接入

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

依赖

<code>

<

dependency

>

<

groupId

>

com.yomahub

groupId

>

<

artifactId

>

tlog-all-spring-boot-starter

artifactId

>

<

version

>

1.0.0

version

>

dependency

>

复制代码/<code>

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

日志框架适配

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

<code> 

public

class

Runner

{

static

{AspectLogEnhance.enhance();}

public

static

void

main

(String[] args)

{ SpringApplication.run(Runner

.

class

,

args

)

; } } 复制代码/<code>

需要注意的是,因为这里是用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端代码:

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

日志打印:

<code>

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

复制代码

/<code>

Provider代码:

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

日志打印:

<code>

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

复制代码

/<code>

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

改变日志标签的格式

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

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

<code>tlog.pattern=[

$preApp

][

$preIp

][

$traceId

] 复制代码/<code>

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

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

$traceId:全局唯一跟踪ID

Log框架的单独适配

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

Log4j配置文件增强

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

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

<code> 
 :configuration 

SYSTEM

"log4j.dtd"

>

<

log4j:configuration

>

<

appender

name

=

"stdout"

class

=

"org.apache.log4j.ConsoleAppender"

>

<

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"

/>

<

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

>

复制代码/<code>

Logback的配置文件增强

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

以下给出xml示例:

<code> 

<

configuration

debug

=

"false"

>

<

property

name

=

"APP_NAME"

value

=

"logtest"

/>

<

property

name

=

"LOG_HOME"

value

=

"./logs"

/>

<

appender

name

=

"STDOUT"

class

=

"ch.qos.logback.core.ConsoleAppender"

>

<

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

>

<

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

>

复制代码/<code>

Log4j2的配置文件增强

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

后语

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

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

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

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


分享到:


相關文章: