【问题标题】:Add trace.id and transaction.id Springboot添加 trace.id 和 transaction.id Spring Boot
【发布时间】:2020-09-08 02:27:41
【问题描述】:
我有一个 Springboot 微服务。对于日志记录,我使用 Elastic 通用方案,使用 ecs-logging-java 实现。
我想设置 trace.ID 和一个 transaction.ID 但我不确定如何设置?
奖金问题,我的想法是正确的 trace.ID 应该是通过多个系统跟踪请求的 ID。 transaction.ID 仅用于服务内?
【问题讨论】:
标签:
java
spring-boot
logging
log4j2
elastic-common-schema
【解决方案1】:
如下配置您的日志记录模式
<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
【解决方案2】:
我以为我已经记录了这一点,但我最接近的是 Log4j-Audit 的 RequestContext.。我想我需要在我的博客中添加一个新条目。对此的简短回答是您使用 Log4j 2 的 ThreadContextMap。首先,当用户登录时,创建一个会话映射,其中包含您要在每个请求中捕获的数据,例如用户的 ip 地址和 loginId。然后创建 servlet Filter 或 Spring Interceptor 以将该数据以及唯一的请求 id 添加到 Log4j 2 的 Thread Context Map。
所有腿部事件都将包含 ThreadContext 中的数据。 ECSLayout 自动包含 ThreadContextMap 中的所有字段。
最后,您需要将 RequestContext 传播到下游服务。您可以通过创建一个连接到 RestTemplate 的 Spring 拦截器来做到这一点,它将 RequestContext 字段转换为 HTTP 标头。然后下游服务有一个过滤器或弹簧拦截器,将标头转换回 RequestContext 属性。 Log4j Audit(上面引用过)包含所有这些组件的示例和实现。
我应该补充一点,上述方法没有实现 WSC Trace Context 规范中描述的跟踪,因此它也与 Elasticsearch 的 distributed tracing support 不兼容。然而值得注意的是,如果将 Elasticsearch 的分布式跟踪支持与 New Relic 的分布式跟踪支持一起包括在内,它们将相互影响。