前言
" 新项目查日志太麻烦,多台机器之间查来查去,还不知道是不是同一个请求的。打印日志时使用 MDC 在日志上添加一个 traceId,那这个 traceId 如何跨系统传递呢?
"
1
背景
同样是新项目开发的笔记,因为使用的是分布式架构,涉及到各个系统之间的交互
这时候就会遇到一个很常见的问题:
- 单个系统是集群部署,日志分布在多台服务器上;
- 多个系统的日志在多台机器,但是一次请求,查日志更是难上加难。
解决方案
- 使用 SkyWalking traceid 进行链路追踪;
- 使用 Elastic APM 的 trace.id 进行链路追踪;
- 自己生成 traceId 并 put 到 MDC 里面。
2
MDC
MDC(Mapped Diagnostic Context)是一个映射,用于存储运行上下文的特定线程的上下文数据。因此,如果使用log4j进行日志记录,则每个线程都可以拥有自己的MDC,该MDC对整个线程是全局的。属于该线程的任何代码都可以轻松访问线程的MDC中存在的值。
如何使用 MDC
- 在 log4j2-spring.xml 的日志格式中添加
%X{traceId}
配置。
<Property name="LOG_PATTERN">
[%d{yyyy-MM-dd HH:mm:ss.SSS}]-[%t]-[%X{traceId}]-[%-5level]-[%c{36}:%L]-[%m]%n
Property>
<Property name="LOG_PATTERN_ERROR">
[%d{yyyy-MM-dd HH:mm:ss.SSS}]-[%t]-[%X{traceId}]-[%-5level]-[%l:%M]-[%m]%n
Property>
&