简单说明:
- 对于RequestId的获取方法 getRequestId,我们优先从header头获取,有网关的场景下一般会从网关传递过来;其次判断是否已经存在,如果存在则直接返回,这里是为了兼容有过滤器并且在过滤器生成了RequestId的场景;最后之前2中场景都未找到RequestId,则自己生成,并且返回
- MDC.put("REQUEST_ID", requestId) 在我们生成RequestId之后,需要设置到日志系统中,这样子日志文件才能打印RequestId
- printRequestParam 和 printResponse 是打印请求参数和响应参数,如果是高并发或者参数很多的场景下,最好不要打印
- handleRequestId 、 handleBusinessException 、 handleSystemException 这三个方法分别是在接口正常、接口业务异常、接口系统异常的场景下设置RequestId
- 日志文件配置
<contextName>logback</contextName><springProperty scope="context" name="level" source="logging.level.root"/><springProperty scope="context" name="path" source="logging.file.path"/><Appender name="console" class="ch.qos.logback.core.ConsoleAppender"><Target>System.out</Target><filter class="ch.qos.logback.classic.filter.ThresholdFilter" ><level>DEBUG</level></filter><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{REQUEST_ID}] [%thread] [%-5level] [%logger{0}:%L] : %msg%n</pattern></encoder></appender><appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${path}</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${path}.%d{yyyy-MM-dd}.zip</fileNamePattern></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{REQUEST_ID}] [%thread] [%-5level] [%logger{0}:%L] : %msg%n</pattern></encoder></appender><root level="${level}"><appender-ref ref="console"/><appender-ref ref="file"/></root>
这里是一个简单的日志格式配置文件,主要是关注[%X{REQUEST_ID}], 这里主要是把RequestId在日志文件中打印出来- 解决线程异步场景下RequestId的打印问题
public class MdcExecutor implements Executor {private Executor executor;public MdcExecutor(Executor executor) {this.executor = executor;}@Overridepublic void execute(Runnable command) {final String requestId = MDC.get("REQUEST_ID");executor.execute(() -> {MDC.put("REQUEST_ID", requestId);try {command.run();} finally {MDC.remove("REQUEST_ID");}});}}
这里是一个简单的代理模式,代理了Executor,在真正执行的run方法之前设置RequestId到日志系统中,这样子异步线程的日志同样可以打印我们想要的RequestId测试效果
- 登录效果
文章插图
文章插图
- 正常的业务处理
文章插图
文章插图
- 发生业务异常
文章插图
文章插图
- 发生系统异常
文章插图
文章插图
- 异步线程
文章插图
文章插图
最后通过以上骚操作,同学,你知道怎么使用RequestId看日志了吗?
【不会吧,你还不会用RequestId看日志 ?】
推荐阅读
- 比普通主板贵一点,带WiFi的主板值不值得选?实测告诉你
- Linux内存占用常用的几个分析方法,你确定都知道?
- 如何将播客内容下载到 Mac 进行离线收听
- 薄荷茶能天天喝吗,槐米茶能天天喝吗你知道槐米茶的功能功效吗
- 喝牛奶和不喝牛奶的人,有什么区别?这3个好处会找上你
- 亚麻籽粉酥饼的做法
- 考研成绩怎么查看排名?
- 你一定知道房子风水的禁忌
- 翡翠|你知道翡翠如意,过去有什么用途吗?原来还有这么好玩的一个说法
- 微软|Edge版本刷到100了!这些实用功能你都知道吗