java tracelog_JAVA通过Logback实现日志traceId功能

1、背景

在项目中随着项目的业务越来越复杂,以及项目的微服务化等,导致平常的项目中出现如:同一次操作日志散乱等现象,对通过查询日志的方式排查问题造成极大困扰.因此迫切需要一种可以追溯当前链路操作日志的手段.

为什么需要实现traceId呢?traceId也是属于追溯当前链路操作日志的一种有效手段.当有效的日志信息不是很明显,我们需要追溯本次操作整个链路的关键信息时,由于日志的散乱,可能在此事上面耗费较大的精力并且结果还可能有误,因此traceId就显得至关重要了。

traceId: 日志中每一次操作都有该次操作的唯一traceId,属于当前操作的所有相关日志都记录了本次的traceId,回溯的时候只需要通过traceId就能获取到指定操作的全链路日志信息.这样可以保证获取的信息都是咱想要的.也节省了不少排查问题的精力

2、目的

通过实现traceId功能,获取当前操作链路的以下日志信息:

a、当前操作http请求伴有traceId的日志信息

b、当前操作java服务端伴有traceId的日志信息

c、当前操作java服务端伴有traceId的dubbo consumer日志信息

d、当前操作java服务端伴有traceId的dubbo provider日志信息

e、其他可以串起来的服务日志信息,如MQ、异步线程等......

3、思路

假设当前项目的请求的链路含有: 前端http调用 -> 后端接受(当前为Java) -> 后端接受处理 -> 发送MQ || 开启异步线程 || 调用RPC接口(本次以dubbo为例)

所以咱只要能将执行链路上每个链路节点信息的通过其可传递性将当前操作的traceId串起来,那么问题就解决了.

4、后端Java方案

当前方案部分可实现目标:

1、前端http请求的入参、响应状态、响应时间等信息

2、调用dubbo provider服务的入参、ip、响应参数、耗时等信息

3、接受dubbo consumer服务的入参、ip、响应参数等信息

4、异步线程的有效信息等

....

当前选用springmvc+spring+dubbo作为框架模板,日志输出使用logback.

核心思想利用slf4j的MDC进行服务端日志串联操作.

5、核心实现:

step1:后端连接前端http处理

a) web.xml中配置&&,处理指定规则内的请求.

b) 创建HttpAccessDataLogFilter继承OncePerRequestFilter对请求信息进行拦截处理:

①获取前端传递过来的traceId(如果有的话),如果没有,则生成当前操作下的traceId(有很多方式,本方案采用ip地址+进程id+原子计数的方式).

②将traceId放入slf4j的MDC.

③记录所需的日志.

核心代码如下:

web.xml.

requestLogFilter

com.toxic.anepoch.common.web.filter.HttpAccessDataLogFilter

loggerName

requestLogFilter

requestLogFilter

/*

HttpAccessDataLogFilter.

String traceID = request.getHeader("TRACE_ID");

if (StringUtils.isBlank(traceID)) {

你可能感兴趣的:(java,tracelog)