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 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目