不会吧,你还不会用RequestId看日志 ?( 二 )

简单说明:

  • 对于RequestId的获取方法 getRequestId,我们优先从header头获取,有网关的场景下一般会从网关传递过来;其次判断是否已经存在,如果存在则直接返回,这里是为了兼容有过滤器并且在过滤器生成了RequestId的场景;最后之前2中场景都未找到RequestId,则自己生成,并且返回
  • MDC.put("REQUEST_ID", requestId) 在我们生成RequestId之后,需要设置到日志系统中,这样子日志文件才能打印RequestId
  • printRequestParam 和 printResponse 是打印请求参数和响应参数,如果是高并发或者参数很多的场景下,最好不要打印
  • handleRequestId 、 handleBusinessException 、 handleSystemException 这三个方法分别是在接口正常、接口业务异常、接口系统异常的场景下设置RequestId
  1. 日志文件配置
<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在日志文件中打印出来
  1. 解决线程异步场景下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看日志 ?

文章插图
 
  • 正常的业务处理

不会吧,你还不会用RequestId看日志 ?

文章插图
 

不会吧,你还不会用RequestId看日志 ?

文章插图
 
  • 发生业务异常

不会吧,你还不会用RequestId看日志 ?

文章插图
 

不会吧,你还不会用RequestId看日志 ?

文章插图
 
  • 发生系统异常

不会吧,你还不会用RequestId看日志 ?

文章插图
 

不会吧,你还不会用RequestId看日志 ?

文章插图
 
  • 异步线程

不会吧,你还不会用RequestId看日志 ?

文章插图
 

不会吧,你还不会用RequestId看日志 ?

文章插图
 
最后通过以上骚操作,同学,你知道怎么使用RequestId看日志了吗?

【不会吧,你还不会用RequestId看日志 ?】


推荐阅读