wordpress做了个站没流量,wordpress更换ssl证书,网站秒收录,江门营销型网站建设公司导读#xff1a;在实际开发中#xff0c;打印日志是十分重要的。在生产环境中#xff0c;如果日志打得好可以快速地排查问题#xff0c;而在分布式的场景下#xff0c;一个请求会跨越多个节点#xff0c;既一个业务可能需要多个节点协调配合处理。那么日志将会分散#…导读在实际开发中打印日志是十分重要的。在生产环境中如果日志打得好可以快速地排查问题而在分布式的场景下一个请求会跨越多个节点既一个业务可能需要多个节点协调配合处理。那么日志将会分散而为了更好的查看日志我们需要将它们串联起来这样便会使排查问题变得更佳轻松。串联ID在分布式日志打印的好处举例一个简单分布式场景下使用串联日志的例子。场景如下一笔支付请求从产品系统发起期间经历了核心系统和网关系统最后调用银行系统实现资金划转并逐步响应结果直到回到产品系统。这里暂且把整个支付流程看作是同步的当这笔交易在生产环境中因其中某一环境出现异常时我们需查看日志进行排查而这笔交易因为流经多个系统所以日志是分散的。这时候如果有一个唯一标识且能把所有日志串联起来那么将会方便和提高问题排查的效率。串连ID的实现方式串联的核心要点是把ID做为一个请求必传参数。常见如采用手动打印日志既在各个接口服务内多处加上logger打印打印内容里加上串联ID如但是还有另一种更简便的打印方式既是MDC ( Mapped Diagnostic Contexts ) AOP切面结合。MDC它是一个线程安全的存放诊断日志的容器。在处理请求前将请求的唯一标示放到MDC容器中这个唯一标示会随着日志一起输出以此来区分该条日志是属于那个请求的。并在请求处理完成之后清除MDC容器。MDC对外提供的方法Logback配置使用Logback的MDC机制需要在logback.xml日志模板中进行一些设置在logback.xml中通过使用 %X{ }来占位替换到对应的MDC中key的值。MDC容器的key可以多次赋值每一次赋值会覆盖上一次的值。MDC简单应用例子往MDC容器中put入键值对在日志打印时日志会按照我们预先在logback.xml中的格式输出而其中占位符会替换上MDC中对应key的value值。打印结果如下MDC与AOP切面的结合如编写一个切面被调用的服务在执行操作前切面会将关键信息输出日志并同时将串联ID put到容器中使其能在接下来同一线程内输出的日志中都包含该串联ID信息在将日志串联起来的同时也方便了日志的打印。除了自定义切面外Logback也提供了一个过滤器MDCInsertingServletFilter感兴趣的朋友可以去详细了解下。管理每个线程的MDC容器这里要特别要注意一点的是在主线程上新起一个子线程并由 java.util.concurrent.Executors来执行它时在早期的版本中子线程可以直接自动继承父线程的MDC容器中的内容因为MDC在早期版本中使用的是InheritableThreadLocal来作为底层实现。但是由于性能问题被取消了最后还是使用的是ThreadLocal来作为底层实现。这样子线程就不能直接继承父线程的MDC容器。举个例子例如支付操作为异步时网关接收了核心的支付请求后会新开一个线程去处理支付请求并响应回核心受理成功(注意这里受理代表接收到支付的请求而不代表处理成功)。那这样做就会导致新的子线程MDC并没有继承父线程中的东西导致响应结果时缺失串联ID信息不能与支付请求关联起来。解决方案根据以上问题Logback官方建议父线程新建子线程之前调用MDC.getCopyOfContextMap()方法将MDC内容取出来传给子线程子线程在执行操作前先调用MDC.setContextMap()方法将父线程的MDC内容设置到子线程。最后以上就是分布式场景下一种较为不错的日志打印方式通过结合AOP切面与Logback的MDC机制将多个系统间有关联的日志串联起来有助于问题的排查及信息的查看。如果有其他不错的日志打印方式也欢迎提出共同讨论学习。感谢您的阅读如果喜欢本文欢迎关注和转发本头条号将坚持原创持续分享IT技术知识。对于文章内容有其他想法或意见建议等欢迎提出共同讨论共同进步