java tracelog_trace-log-spring-boot-starter: trace-log-spring-boot-starter一个简单易用的java分布式链路跟踪日志组件 一.系...

龚宏壮
2023-12-01

trace-log-spring-boot-starter

介绍

trace-log-spring-boot-starter (traceLog)一个简单易用的java分布式链路跟踪日志组件,

支持百亿级别, 日志从搜集到查询, 不用去文件中翻阅日志方便快捷, 支持查询一个调用链的日志,

支持链路追踪, 查看调用链耗时情况, 在分布式系统中也可以查询关联日志, 能够帮助快速定位问题,

简单易用,没有代码入侵, 查询界面友好,高效,方便,

只要你是java系统,不要做任何项目改造,接入直接使用,

日志不落本地磁盘,无需关心日志占用应用服务器磁盘问题,觉得项目好用帮忙点个星星, 您的star是我们前进的动力

目前进度:1.0版本完成

一.系统介绍

1、无入侵的分布式日志系统,基于elk搜集日志,采用Skywalking设置链路ID,方便查询关联日志

2、基于elasticsearch作为查询引擎

3、高吞吐,查询效率高

4、支持redis实时日志、es历史日志查询

5、Skywalking 6.0.0-beta 支持跟踪如下中间件的日志

![https://github.com/apache/skywalking/blob/master/docs/en/setup/service-agent/java-agent/Supported-list.md](Skywalking 6.0.0-beta 支持的组件)

HTTP Server

Tomcat 7

Tomcat 8

Tomcat 9

Spring Boot Web 4.x

Spring MVC 3.x, 4.x 5.x with servlet 3.x

Nutz Web Framework 1.x

Struts2 MVC 2.3.x -> 2.5.x

Resin 3 (Optional¹)

Resin 4 (Optional¹)

Jetty Server 9

Spring WebFlux 5.x

Undertow 1.3.0.Final -> 2.0.27.Final

RESTEasy 3.1.0.Final -> 3.7.0.Final

Play Framework 2.6.x -> 2.8.x

Light4J Microservices Framework 1.6.x -> 2.x

Netty SocketIO 1.x

HTTP Client

Feign 9.x

Netflix Spring Cloud Feign 1.1.x -> 2.x

Okhttp 3.x

Apache httpcomponent HttpClient 2.0 -> 3.1, 4.2, 4.3

Spring RestTemplete 4.x

Jetty Client 9

Apache httpcomponent AsyncClient 4.x

HTTP Gateway

Spring Cloud Gateway 2.1.x.RELEASE (Optional²)

JDBC

Mysql Driver 5.x, 6.x, 8.x

Oracle Driver (Optional¹)

H2 Driver 1.3.x -> 1.4.x

Sharding-JDBC 1.5.x

ShardingSphere 3.0.0, 4.0.0-RC1

PostgreSQL Driver 8.x, 9.x, 42.x

Mariadb Driver 2.x, 1.8

RPC Frameworks

Dubbo 2.5.4 -> 2.6.0

Dubbox 2.8.4

Apache Dubbo 2.7.0

Motan 0.2.x -> 1.1.0

gRPC 1.x

Apache ServiceComb Java Chassis 0.1 -> 0.5,1.x

SOFARPC 5.4.0

Armeria 0.63.0 -> 0.98.0

Apache Avro 1.7.0 - 1.8.x

Finagle 6.25.0 -> 20.1.0

MQ

RocketMQ 4.x

Kafka 0.11.0.0 -> 1.0

ActiveMQ 5.10.0 -> 5.15.4

RabbitMQ 5.x

Pulsar 2.2.x -> 2.4.x

NoSQL

Redis

Jedis 2.x

Redisson Easy Java Redis client 3.5.2+

Lettuce 5.x

MongoDB Java Driver 2.13-2.14, 3.4.0-3.11.1

Memcached Client

Spymemcached 2.x

Xmemcached 2.x

Elasticsearch

transport-client 5.2.x-5.6.x

transport-client 6.7.1-6.8.4

rest-high-level-client 6.7.1-6.8.4

rest-high-level-client 7.0.0-7.5.2

Solr

SolrJ 7.x

Cassandra 3.x

cassandra-java-driver 3.7.0-3.7.2

Service Discovery

Netflix Eureka

Distributed Coordination

Zookeeper 3.4.x (Optional² & Except 3.4.4)

Spring Ecosystem

Spring Bean annotations(@Bean, @Service, @Component, @Repository) 3.x and 4.x (Optional²)

Spring Core Async SuccessCallback/FailureCallback/ListenableFutureCallback 4.x

Spring Transaction 4.x and 5.x (Optional²)

Hystrix: Latency and Fault Tolerance for Distributed Systems 1.4.20 -> 1.5.12

Scheduler

Elastic Job 2.x

OpenTracing community supported

Canal: Alibaba mysql database binlog incremental subscription & consumer components 1.0.25 -> 1.1.2

JSON

GSON 2.8.x (Optional²)

Vert.x Ecosystem

Vert.x Eventbus 3.2+

Vert.x Web 3.x

Thread Schedule Framework

Spring @Async 4.x and 5.x

Cache

Ehcache 2.x

Kotlin

Coroutine 1.0.1 -> 1.3.x (Optional²)

软件架构

软件架构说明

1、 log-spring-boot-starter 客户端starter,收集链路日志,通过 log-spring-boot-netty 发送日志给 log-spring-boot-core

2、 log-spring-boot-core 日志核心组件,将收集到的日志异步存入redis 和 es

3、log-spring-boot-netty 网络通信组件,starter 和 core 基于netty进行通信

软件技术栈

1、spring boot

2、skywalking

3、redis

4、es

5、netty

7、kafka

安装教程

xxxx

xxxx

xxxx

使用说明

安装部署skywalking

linux或者Windows都行

,下面为Linux

cd /home/data/app/

wget https://mirror.bit.edu.cn/apache/skywalking/6.6.0/apache-skywalking-apm-es7-6.6.0.tar.gz

tar -xzvf apache-skywalking-apm-es7-6.6.0.tar.gz

2、服务端

2.1 、 application.properties 新增配置

# netty 服务端端口

ddfeiyu.netty.server.port=8082

## 日志redis队列 (注意redis集群模式和单机模式可任意配置一项。如果全部配置,则采用集群ip ,下面实例则为redis集群模式)

# redis集群模式

ddfeiyu.redis.cluster.nodes=10.10.10.1:7001,10.10.10.2:7001,10.10.10.3:7001

ddfeiyu.redis.cluster.max-redirects=5

#redis单机模式

ddfeiyu.redis.host=192.168.0.125

ddfeiyu.redis.port=6379

ddfeiyu.redis.password=

ddfeiyu.redis.database=0

#连接超时时间

ddfeiyu.redis.timeout=6000

#连接池最大连接数,pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。默认值8

ddfeiyu.redis.jedis.pool.max-active=1000

#连接池最大阻塞等待时间(使用负值没有限制),# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时

ddfeiyu.redis.jedis.pool.max-wait=1000

#连接池中的最大空闲连接,默认值8

ddfeiyu.redis.jedis.pool.max-idle=8

#连接池中的最小空闲连接,默认值0

ddfeiyu.redis.jedis.pool.min-idle=8

客户端

项目引入例子 ,参考 log-spring-boot-demo

3.1、修改skywalking的agent.config配置

目录: C:\apache-skywalking-apm-6.6.0\apache-skywalking-apm-bin\agent\config\agent.config

collector.backend_service=10.19.93.169:11800

修改collector.backend_service 为skywalking 服务端ip

3.2、VM参数加入如下参数

-javaagent:C:\apache-skywalking-apm-6.6.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar -Dskywalking.agent.service_name=log-demo

3.3、引入依赖

com.ddfeiyu

log-spring-boot-starter

1.0-SNAPSHOT

3.4 、 application.properties 新增配置

# 显示在全链路日志中的app名称,可根据项目定义

spring.application.name=log-app-demo

## 日志redis队列 (注意redis集群模式和单机模式可任意配置一项。如果全部配置,则采用集群ip ,下面实例则为redis集群模式)

# redis集群模式

ddfeiyu.redis.cluster.nodes=10.10.10.1:7001,10.10.10.2:7001,10.10.10.3:7001

ddfeiyu.redis.cluster.max-redirects=5

#redis单机模式

ddfeiyu.redis.host=192.168.0.125

ddfeiyu.redis.port=6379

ddfeiyu.redis.password=

ddfeiyu.redis.database=0

#连接超时时间

ddfeiyu.redis.timeout=6000

#连接池最大连接数,pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。默认值8

ddfeiyu.redis.jedis.pool.max-active=1000

#连接池最大阻塞等待时间(使用负值没有限制),# 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时

ddfeiyu.redis.jedis.pool.max-wait=1000

#连接池中的最大空闲连接,默认值8

ddfeiyu.redis.jedis.pool.max-idle=8

#连接池中的最小空闲连接,默认值0

ddfeiyu.redis.jedis.pool.min-idle=8

3.5 、打日志:需要打日志的类和方法分别打上如下注解

类上加注解

@EnableTraceLog

方法上加注解

@TraceLog(description = "第一个日志demo")

@Trace

示例如下:

@EnableTraceLog

public class LogController {

@TraceLog(description = "第一个日志demo")

@Trace

@GetMapping("/log")

public String log(){

String traceId = TraceContext.traceId();

log.info("trcaeId: [ {} ]", traceId);

return traceId;

}

3.6 、查询全链路日志

我们已经知道链路tarceId,并且日志已经在redis队列中了,那么怎么查询到全链路日志呢,

参考示例

1、下面例子简单模拟获取全链路日志

@GetMapping("/print")

public List print(@RequestParam(name = "traceId") String traceId){

log.info("trcaeId: [ {} ]", traceId);

List traceLogList = new ArrayList<>();

String traceLog = "";

while ((traceLog = redisQueueUtil.dequeue(traceId)) != null){

log.info("trcaeId: [ {} ], traceLog: [ {} ]", traceId , traceLog);

traceLogList.add(traceLog);

}

return traceLogList;

}

2、其它方式:服务端也可通过websocket方式将日志推送给前端等等

演示

3.1、启动 log-spring-boot-core

3.2 启动 log-spring-boot-demo

3.3. 产生日志

返回一个tarceId

3.4 查询链路日志

日志格式:

{

"app":"log-app-demo",

"arguments":"[UserDto(userId=方法带注解)]",

"clazzName":"com.ddfeiyu.service.UserServiceImpl",

"description":"打上日志TraceLog注解的日志",

"elapsedTime":0,

"errorMsg":"",

"host":"169.254.141.95",

"logTime":"2020-05-31 11:35:33.369",

"methodName":"sayHelloWithAnnotation",

"parameterTypes":"[class com.ddfeiyu.dto.UserDto]",

"status":"成功",

"traceId":"549.36.15908961313010001"

}

日志格式说明

{

"app":"log-app-demo", 应用名称

"arguments":"[UserDto(userId=方法带注解)]", 方法入参

"clazzName":"com.ddfeiyu.service.UserServiceImpl", 类名

"description":"打上日志TraceLog注解的日志", 日志描叙

"elapsedTime":0, 方法耗时

"errorMsg":"", 异常消息

"host":"169.254.141.95", 应用ip

"logTime":"2020-05-31 11:35:33.369", 日志时间

"methodName":"sayHelloWithAnnotation", 方法名称

"parameterTypes":"[class com.ddfeiyu.dto.UserDto]", 入参参数类型

"status":"成功", 方法执行状态

"traceId":"549.36.15908961313010001" 链路跟踪id

}

版本计划

1.0 版本(已实现)

a、增加全链路追踪功能

b、日志写入redis队列

2.0版本,

a、优化日志抓取写入,采用高性能无锁队列Disruptor处理日志 https://www.cnblogs.com/aheizi/p/6879931.html

b、日志写入es做历史日志归档和查询

3.0版本

a、编写前端页面,提供日志索引管理、日志查询、日志队列管理功能

b、抓取链路中db sql,写入日志

6.联系交流

QQ群: 816929140

参与贡献

Fork 本仓库

新建 Feat_xxx 分支

提交代码

新建 Pull Request

码云特技

使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md

GVP 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目

 类似资料: