添加 trace.id 和 transaction.id Springboot

Add trace.id and transaction.id Springboot

我有一个Springboot微服务。对于日志记录,我使用 Elastic 通用方案,使用 ecs-logging-java.

实现

我想设置 trace.ID 和 transaction.ID 但我不确定如何设置?

奖金问题,我认为 trace.ID 应该是通过多个系统跟踪请求的 ID。 transaction.ID 仅适用于服务内?

我以为我已经记录了这一点,但我能找到的最接近的记录在 Log4j-Audit 的 RequestContext.. I guess I need to add a new entry to my blog. The short answer to this is that you use Log4j 2's ThreadContextMap 中。首先,当用户登录时创建一个 session 映射,其中包含您要在每个请求中捕获的数据,例如用户的 ip 地址和 loginId。然后创建 servlet 过滤器或 Spring 拦截器以将该数据以及唯一请求 ID 添加到 Log4j 2 的线程上下文映射。

所有腿事件都将包含 ThreadContext 中的数据。 ECSLayout 自动包含 ThreadContextMap 中的所有字段。

最后,您需要将 RequestContext 传播到下游服务。为此,您可以创建一个 Spring 拦截器,该拦截器连接到 RestTemplate 中,将 RequestContext 字段转换为 HTTP headers。下游服务然后有一个过滤器或 Spring 拦截器将 headers 转换回 RequestContext 属性。 Log4j Audit(上面引用)有所有这些组件的示例和实现。

我应该补充一点,上面描述的方法没有实现 WSC Trace Context spec so it is also not compatible with Elasticsearch's distributed tracing support 描述的跟踪。然而,值得注意的是,如果将 Elasticsearch 的分布式跟踪支持与 New Relic 的分布式跟踪支持一起包括在内,它们会相互踩踏。

如下配置您的日志模式

<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} %thread [%X{trace-id}] [%-5level] %class{0} - %msg%n </pattern>

将跟踪 ID 放入 MDC。 (MDC 属于特定的线程上下文)

  `MDC.put("trace-id", "traceid1");`

因此,每当您的日志打印消息时,它都会打印跟踪 ID。 按照下面的文章。http://logback.qos.ch/manual/mdc.html

第 1 步:在线程上下文中添加跟踪 ID。

这可以使用 MDC 来完成(在 per-thread 的基础上管理上下文信息)。 在您要跟踪日志的任何方法的开头添加以下行。

MDC.put("TRACE_ID", UUID.randomUUID().toString());

第 2 步:以日志格式添加跟踪 ID

java中的日志默认不添加trace id,因此为了实现这一点,我们可以将之前在线程上下文中添加的trace id添加到日志中。 这可以添加到 application.properties 我在默认日志控制台模式中添加了 [%X{TRACE_ID}]

logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} [%X{TRACE_ID}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}