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

9次阅读

共计 5580 个字符,预计需要花费 14 分钟才能阅读完成。

前言

随着微服务流行,很多公司都把零碎依照业务边界拆成了很多微服务,在排错查日志的时候。因为业务链路贯通着很多微服务节点,导致定位某个申请的日志以及上下游业务的日志会变得有些艰难。

这时候很多童鞋会开始思考上 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 能退出群聊,我会急躁答复你的每一个应用中的问题,也会长期对这个我的项目进行长期保护和迭代。

正文完
 0