SpringBoot实战(二十一)集成 TLog 日志

news2024/11/23 6:41:27

目录

    • 一、简介
    • 二、Maven依赖
    • 三、启动类集成
    • 四、测试
      • 1.服务简介
      • 2.服务A代码
        • DemoController.java
        • DemoFeignClient.java
      • 3.服务B代码
      • 4.测试结果
    • 补充一:自定义日志标签模板
    • 补充二:SpanId的生成规则
    • 补充三:业务标签
      • 1.打印入参
      • 2.指定连接符
      • 3.打印常量
      • 4.打印JSON某属性
    • 补充四:打印调用参数和时间

在这里插入图片描述

  • 官方网站: https://tlog.yomahub.com/
  • 官方文档: https://tlog.yomahub.com/pages/5b7bd2/
  • Gitee: https://gitee.com/dromara/TLog
  • GItHub: https://github.com/dromara/TLog
  • 官方示例: https://gitee.com/bryan31/tlog-example

一、简介

TLog 是一款国产的轻量级分布式日志标记追踪组件。集成方便,通过对日志打标签的方式实现了微服务的链路追踪。支持 log4jlog4j2logback 三大日志框架。支持 dubbodubboxspringcluod 三大RPC框架。

特点: 轻量级、10分钟接入、适配广泛。

二、Maven依赖

spring boot依赖:

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

spring native依赖:

<dependency>
  <groupId>com.yomahub</groupId>
  <artifactId>tlog-all</artifactId>
  <version>1.5.1</version>
</dependency>

以上是集成了 TLog 的全部依赖,如果只想集成 TLog 的部分依赖可以根据需要进行选择:

模块名适用项目
tlog-dubbo-spring-boot-starter适用于 apache dubbo 项目。
tlog-dubbox-spring-boot-starter适用于当当的 dubbox 项目。
tlog-feign-spring-boot-starter适用于 spring cloud 中 open feign 项目。
tlog-gateweay-spring-boot-starter适用于 spring cloud 中 gateway 网关服务。
tlog-soul-spring-boot-starter适用于 soul 网关服务。
tlog-web-spring-boot-starter适用于 spring web 项目。
tlog-xxljob-spring-boot-starter适用于 xxl-job 项目。

三、启动类集成

在 Spring Boot 项目中,集成 TLog 只需在引入相关依赖后,在启动类增加 static {AspectLogEnhance.enhance();} 即可生效。

import com.yomahub.tlog.core.enhance.bytes.AspectLogEnhance;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootDemoApplication {

    //进行日志增强,自动判断日志框架
    static {AspectLogEnhance.enhance();}

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDemoApplication.class, args);
    }
}

到这一步就可以启动项目运行测试了,下面是一些测试和定制化的内容说明。

四、测试

1.服务简介

这里我们搭建三个服务:tlog-eurekatlog-feign-atlog-feign-b。调用关系如下:

2.服务A代码

DemoController.java

import com.demo.common.Result;
import com.demo.feign.DemoFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/demo")
public class DemoController {

    @Autowired
    private DemoFeignClient demoFeignClient;

    @GetMapping("/feignTest")
    public Result<Object> feignTest() {
        log.info("feignTest");
        return demoFeignClient.test();
    }
}

DemoFeignClient.java

import com.demo.common.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "tlog-feign-b")
public interface DemoFeignClient {

    @GetMapping("/demo/test")
    Result<Object> test();
}

3.服务B代码

import com.demo.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/demo")
public class DemoController {

    @Value("${server.port:}")
    private String port;

    @GetMapping("/test")
    public Result<Object> test() {
        log.info("这是第一条日志。port:" + port);
        log.info("这是第二条日志。port:" + port);
        log.info("这是第三条日志。port:" + port);
        return Result.succeed();
    }
}

4.测试结果

请求接口: http://localhost:8081/demo/feignTest

请求结果:

在这里插入图片描述

服务A日志:

在这里插入图片描述

2023-07-22 18:03:50.396  INFO 4464 --- [nio-8081-exec-8] c.y.t.w.i.TLogWebInvokeTimeInterceptor   : <NONE><0><vouM834852011728769024> [TLOG]开始请求URL[/demo/feignTest],参数为:{}
2023-07-22 18:03:50.397  INFO 4464 --- [nio-8081-exec-8] com.demo.controller.DemoController       : <NONE><0><vouM834852011728769024> >>>>>>>>>>INFO】feignTest
2023-07-22 18:03:50.410  INFO 4464 --- [nio-8081-exec-8] c.y.t.w.i.TLogWebInvokeTimeInterceptor   : <NONE><0><vouM834852011728769024> [TLOG]结束URL[/demo/feignTest]的调用,耗时为:12毫秒

服务B日志:

在这里插入图片描述

2023-07-22 18:03:50.403  INFO 35816 --- [nio-8082-exec-2] c.y.t.w.i.TLogWebInvokeTimeInterceptor   : <tlog-feign-a><0.1><vouM834852011728769024> [TLOG]开始请求URL[/demo/test],参数为:{}
2023-07-22 18:03:50.404  INFO 35816 --- [nio-8082-exec-2] com.demo.controller.DemoController       : <tlog-feign-a><0.1><vouM834852011728769024> 这是第一条日志。port:8082
2023-07-22 18:03:50.404  INFO 35816 --- [nio-8082-exec-2] com.demo.controller.DemoController       : <tlog-feign-a><0.1><vouM834852011728769024> 这是第二条日志。port:8082
2023-07-22 18:03:50.404  INFO 35816 --- [nio-8082-exec-2] com.demo.controller.DemoController       : <tlog-feign-a><0.1><vouM834852011728769024> 这是第三条日志。port:8082
2023-07-22 18:03:50.407  INFO 35816 --- [nio-8082-exec-2] c.y.t.w.i.TLogWebInvokeTimeInterceptor   : <tlog-feign-a><0.1><vouM834852011728769024> [TLOG]结束URL[/demo/test]的调用,耗时为:3毫秒

补充一:自定义日志标签模板

TLog 默认只打印 spanId 和 traceId,以 <$spanId><$traceId> 模板打印,我们也可以自定义模板,加入其他的标签头。

只需要在 Spring Boot 项目中进行如下配置:

tlog.pattern=<$preApp><$spanId><$traceId>

具体配置项信息如下:

  • $preApp:上游微服务节点名称。
  • $preHost:上游微服务的 Host Name。
  • $preIp:上游微服务的IP地址。
  • $spanId:链路 spanId。
  • $traceId:全局唯一跟踪ID。(雪花算法)

配置好后,TLog 就会按照我们定义的模板进行打印日志。

2023-07-22 17:23:37.788  INFO 33604 --- [nio-8082-exec-1] com.demo.controller.DemoController       : <tlog-feign-a><0.1><EDEN834841887140286464> 这是第一条日志。port:8082
2023-07-22 17:23:37.788  INFO 33604 --- [nio-8082-exec-1] com.demo.controller.DemoController       : <tlog-feign-a><0.1><EDEN834841887140286464> 这是第二条日志。port:8082
2023-07-22 17:23:37.788  INFO 33604 --- [nio-8082-exec-1] com.demo.controller.DemoController       : <tlog-feign-a><0.1><EDEN834841887140286464> 这是第三条日志。port:8082

补充二:SpanId的生成规则

TLog 中的 SpanId 代表本次调用在整个调用链路数中的位置。

假设一个 Web 系统 A 接受了一次用户请求,那么在这个系统的日志中,记录下的 SpanId 会有如下情况:

  • 0,代表在这次请求中, A 系统是整个调用的根节点。
  • 0.10.20.3…,代表 A 系统通过 RPC 依次调用了 B、C、D 等系统。
  • 0.2.10.2.2…,代表在 A 系统调用 C 系统后,C 系统在处理请求的时候又调用了 E、F 等系统。

根据上面的描述,我们可以把一次调用中所有的 SpanId 收集起来,组成一棵完整的链路树:

在这里插入图片描述

补充三:业务标签

很多系统在打印日志的时候,每打印一条日志都会带入一些业务信息,比如记录ID、会员CODE,方便日志的定位。

TLog 除了实现分布式链路标签追加之外,还可以自定义业务标签来添加到日志中。TLog 的自定义业务标签是方法级的。我们可以在方法上使用 @TLogAspect 注解指定需要添加的业务标签字段,TLog 会自动将业务标签统一添加到日志的开头。

业务标签的位置为:<$spanId><$traceId><业务标签>

下面是几种常见的自定义业务标签的使用方法:

1.打印入参

@TLogAspect 注解会读取 id 和 name 值,从而打印到日志中。

@TLogAspect({"id","name"})
public void demo1(String id,String name){
  log.info("这是第一条日志");
  log.info("这是第二条日志");
  log.info("这是第三条日志");
  new Thread(() -> log.info("这是异步日志")).start();
}

日志示例:

2023-07-22 17:41:02.190  INFO 33516 --- [nio-8081-exec-1] com.demo.controller.DemoController       : <0><bInv834846270246686720> [id:"1",name:"ACGkaka"] 这是第一条日志
2023-07-22 17:41:02.190  INFO 33516 --- [nio-8081-exec-1] com.demo.controller.DemoController       : <0><bInv834846270246686720> [id:"1",name:"ACGkaka"] 这是第二条日志
2023-07-22 17:41:02.190  INFO 33516 --- [nio-8081-exec-1] com.demo.controller.DemoController       : <0><bInv834846270246686720> [id:"1",name:"ACGkaka"] 这是第三条日志
2023-07-22 17:41:02.192  INFO 33516 --- [      Thread-28] com.demo.controller.DemoController       : <0><bInv834846270246686720> [id:"1",name:"ACGkaka"] 这是异步日志

2.指定连接符

@TLogAspect 注解支持指定 pattern 和 参数间的连接符。pattern 指的是业务标签的打印格式,其中 {} 表示业务标签的内容。

@TLogAspect(value = {"id","name"},pattern = "<-{}->",joint = "_")
public void demo(String id,String name){
  log.info("加了patter和joint的示例");
}

日志示例:

2020-02-08 22:09:40.103 [main] INFO  Demo - <0.2><7205781616706048><-NO1234_jenny-> 加了patter和joint的示例

3.打印常量

@TLogAspect 注解也支持常量字符串作为业务标签。

@TLogAspect(str = "demo1()")
public void demo1(String name){
  log.info("这是第一条日志");
  log.info("这是第二条日志");
  log.info("这是第三条日志");
  new Thread(() -> log.info("这是异步日志")).start();
}

日志示例:

2020-02-08 20:22:33.945 [main] INFO  Demo - <0.2><7205781616706048>[demo1()] 这是第一条日志
2020-02-08 20:22:33.945 [main] INFO  Demo - <0.2><7205781616706048>[demo1()] 这是第二条日志
2020-02-08 20:22:33.945 [main] INFO  Demo - <0.2><7205781616706048>[demo1()] 这是第三条日志
2020-02-08 20:22:33.948 [Thread-3] INFO  Demo - <0.2><7205781616706048>[demo1()] 这是异步日志

4.打印JSON某属性

@TLogAspect 支持解析JSON入参,通过 . 点操作符可以进行对象属性的取值,支持类型:

  • Java对象
  • JSON格式的字符串

Java 对象属性的获取:

@TLogAspect({"person.id","person.age","person.company.department.dptId"})
public void demo(Person person){
  log.info("多参数加多层级示例");
}

日志示例:

2020-02-08 22:09:40.110 [main] INFO  Demo - <0.2><7205781616706048>[31-25-80013] 多参数加多层级示例

JSON格式字符串属性的获取:

@TLogAspect({"person.id","person.age","person.company.department.dptId"})
public void demo(String person){
  log.info("多参数加多层级示例");
}

JSON格式字符串中数组的获取:

对于JSON格式字符串中的数组,可以用下标 [num] 来获取。

@TLogAspect({"person.id","person.age","person.company.title[1]"})
public void demo(String person){
  log.info("多参数加多层级示例");
}

补充四:打印调用参数和时间

在 Spring Boot 项目中,如果我们想在日志的第一行打印调用的参数和时间,我们可以在配置文件中进行如下配置:

# 默认为false
tlog.enable-invoke-time-print=true

请求地址:http://localhost:8081/demo/tlogTest?id=1&name=ACGkaka

日志示例:

2023-07-22 17:41:02.039  INFO 33516 --- [nio-8081-exec-1] c.y.t.w.i.TLogWebInvokeTimeInterceptor   : <0><bInv834846270246686720> [TLOG]开始请求URL[/demo/tlogTest],参数为:{"id":["1"],"name":["ACGkaka"]}
2023-07-22 17:41:02.190  INFO 33516 --- [nio-8081-exec-1] com.demo.controller.DemoController       : <0><bInv834846270246686720> 这是第一条日志
2023-07-22 17:41:02.190  INFO 33516 --- [nio-8081-exec-1] com.demo.controller.DemoController       : <0><bInv834846270246686720> 这是第二条日志
2023-07-22 17:41:02.190  INFO 33516 --- [nio-8081-exec-1] com.demo.controller.DemoController       : <0><bInv834846270246686720> 这是第三条日志
2023-07-22 17:41:02.192  INFO 33516 --- [      Thread-28] com.demo.controller.DemoController       : <0><bInv834846270246686720> 这是异步日志
2023-07-22 17:41:02.221  INFO 33516 --- [nio-8081-exec-1] c.y.t.w.i.TLogWebInvokeTimeInterceptor   : <0><bInv834846270246686720> [TLOG]结束URL[/demo/tlogTest]的调用,耗时为:171毫秒

整理完毕,完结撒花~ 🌻





参考地址:

1.SpringBoot 2.5.5整合轻量级的分布式日志标记追踪神器TLog,https://www.cnblogs.com/chenyanbin/p/16804650.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习-卷积神经网络CNN-基础】

文章目录 发展历史卷积神经网络的应用领域卷积的原理和作用卷积和传统的神经网络的区别 卷积网络的整体架构输入层卷积层池化层全连接层卷积和池化叠加多层卷积可以处理什么类型的数据卷积的超参数卷积最大的优势 卷积的细节卷积的原理卷积的参数卷积的次数步长 卷积核尺寸 边缘…

成为UI设计高手:如何规划和创建UI设计组件库!

今天给大家分享一篇关于组件化设计的总结&#xff0c;希望可以带给大家更多设计思考。 什么是组件化 组件化化是构成界面的最基础元素和重复出现控件的集合体&#xff0c;也就是常说的组件库。通过对基础元素和控件的规范命名与排列组合&#xff0c;最终形成一个可快速调用与便…

每日一题——地下迷宫(迷宫问题II)

迷宫问题&#xff08;地下迷宫&#xff09;——II 题目链接 前言&#xff1a; 这题是在昨天迷宫问题——I的基础上进行的变形&#xff0c;因此&#xff0c;如果昨天的题目没看或者对迷宫问题不怎么了解&#xff0c;建议先看看昨天的解析。 迷宫问题——I源代码&#xff1a; …

安装redis,适配阿里云服务器,Liunx安装redis

下载redis以及编译安装 下载redis文件 wget http://download.redis.io/releases/redis-6.0.8.tar.gz #下载redis压缩文件 tar xzf redis-6.0.8.tar.gz #解压缩 cd redis-6.0.8 make 查看是否安装了gcc编译输入gcc --version如果没有…

AtcoderABC236场

A - chukodaiA - chukodai 题目大意 题目要求交换字符串S中第a个字符和第b个字符的位置&#xff0c;并输出结果。 思路分析 借用临时变量t&#xff0c;进行记录交换。 时间复杂度 O(∣S∣) 输出交换后的字符串的时间复杂度为O(∣S∣)&#xff0c;其中∣S∣表示字符串SS的…

autohotkey实战:窗口透明化

文章目录 实现方法代码讲解WinGet和WinSet 注 本文采用的是V1版本语法 实现方法 窗口透明不仅实用性强&#xff0c;关键是非常炫酷&#xff0c;如果用AHK实现一个实时调节窗口透明度的工具&#xff0c;那么就可以一边敲代码&#xff0c;一边透过半透明的IDE&#xff0c;愉快地…

vue 3.0 如何实现 文本框只能输入数字 避免文字和符号

<input v-model.number"form.payTime" :min"0" type"number" οninput"valuevalue.replace(/[^0-9.]/g,)" type"text" /> v-model 后面的.numer 一定要加上不然没效果 οninput"valuevalue.replace(/[^0-9.]/g…

Pdb蛋白质数据库网址!+30蛋白质数据库网站!

蛋白质数据库是指专门存储蛋白质相关信息的数据库。它们收集、整理和存储大量的蛋白质数据&#xff0c;包括蛋白质序列、结构、功能、互作关系、表达模式、疾病关联等信息。蛋白质数据库提供了对这些数据的检索、查询和分析功能&#xff0c;为科学研究人员、生物信息学家和药物…

为什么deferred probe将设备挂入延迟链表而不是将驱动挂入延迟链表

1. 代码流程(drivers/base/dd.c) 可以看到在probe失败的时候(驱动返回-EPROBE_DEFER)是把设备挂到deferred_probe_pending_list上面的。 这就带来了一个疑问: 我当前明明是驱动加载的过程(driver_attach()->bus_for_each_dev()), 为什么要将设备挂到pending list上面而不是…

Maven高级(继承与聚合+私服)

分模块设计和开发 为什么要分模块设计&#xff1f; 一个项目往往是分为好几个模块的 如果不同模块全写在一个项目里面 所有的程序员都要调用这有个项目就难以维护 比如我们之前设计的板块 就不太合理&#xff0c;现在我们把实体类和对应的工具类单独开出两个maven模块存储 然…

安装openai和简单使用

Anaconda的界面创建open ai环境&#xff0c;选择python10 控制台 #或者 conda info -e 注意不是anaconda命令开头 (base) C:\Users\su>conda env list # conda environments: # base * F:\anaconda3 openai F:\anaconda3\envs\opena…

TCP的拥塞控制、提高网络利用率的方法【TCP原理(笔记四)】

文章目录 拥塞控制慢启动 提高网络利用率的规范Nagle算法延迟确认应答捎带应答 拥塞控制 有了TCP的窗口控制&#xff0c;收发主机之间即使不再以一个数据段为单位发送确认应答&#xff0c;也能够连续发送大量数据包。然而&#xff0c;如果在通信刚开始时就发送大量数据&#x…

新能源汽车交流充电桩CP信号详解

随着新能源汽车的推广&#xff0c;交流充电桩迎来了巨大的市场需求&#xff0c;人们对车辆充电的便利性、安全性有着越来越高的要求。CP信号主要用于交流充电桩&#xff0c;充电桩和汽车之间只能通过CP信号进行通讯&#xff0c;判断、控制充电电流和状态。 汽车充电桩CP信号…

QT之自定义表格控件

继承QWidget来绘制的一款自定义控件&#xff0c;设计原因是因为Qt自带的QTableWidget的大批量操作很卡&#xff0c;特别是在嵌入式设备上时。 该控件特色功能&#xff1a; 1、支持拖动自适应。 2、支持各种颜色&#xff0c;字体&#xff0c;行列数设置。 代码如下&#xff1a; …

win10安装cuda11.4及cudnn

查看nvidia驱动版本 在windows终端键入nvidia-smi&#xff0c;查看nvidia显卡驱动。显卡驱动的版本决定了CUDA的版本下限。 如果出现上述的问题&#xff0c;则终端进入C:\Program Files\NVIDIA Corporation\NVSMI文件夹内&#xff0c;再键入nvidia-smi&#xff0c;可以看到我…

[MySQL]MySQL视图特性

[MySQL]MySQL视图特性 文章目录 [MySQL]MySQL视图特性1. 视图的概念2. 视图的基本操作创建视图删除视图 3. 视图规则和限制 1. 视图的概念 视图是一个虚拟表&#xff0c;其内容由查询定义&#xff0c;同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。基表是对…

Git标签管理(对版本打标签,起别名)

tag 理解标签创建标签git tag [name]git show [tagname] 操作标签删除标签git tag -d < tagname > 推送某个标签到远程git push origin < tagname > 理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。 …

数据库备份mysqldump、mydumper、xtrabackup

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建sco…

《面试1v1》如何提高远程用户的吞吐量

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

FPGA配置文件从串并模式下载

FPGA配置文件的下载模式有5种&#xff1a; 主串模式&#xff08;master serial&#xff09;从串模式&#xff08;slave serial&#xff09;主并模式&#xff08;master selectMAP&#xff09;从并模式&#xff08;slave selectMAP&#xff09;JTAG模式 其中&#xff0c;JTAG模…