切面是异步还是同步操作‘_分布式中采用Logback的MDC机制与AOP切面结合串联日志...

导读:在实际开发中,打印日志是十分重要的。在生产环境中,如果日志打得好可以快速地排查问题,而在分布式的场景下,一个请求会跨越多个节点,既一个业务可能需要多个节点协调配合处理。那么日志将会分散,而为了更好的查看日志,我们需要将它们串联起来,这样便会使排查问题变得更佳轻松。

d3f5a10ce7888afc0b7990295a2a0af8.png

串联ID在分布式日志打印的好处

举例一个简单分布式场景下使用串联日志的例子。场景如下:一笔支付请求从产品系统发起,期间经历了核心系统和网关系统最后调用银行系统实现资金划转,并逐步响应结果直到回到产品系统。这里暂且把整个支付流程看作是同步的,当这笔交易在生产环境中因其中某一环境出现异常时,我们需查看日志进行排查,而这笔交易因为流经多个系统,所以日志是分散的。这时候如果有一个唯一标识且能把所有日志串联起来那么将会方便和提高问题排查的效率。

72cfc9735b5719e7e787583512329865.png

串连ID的实现方式

串联的核心要点是把ID做为一个请求必传参数。常见如采用手动打印日志,既在各个接口服务内多处加上logger打印,打印内容里加上串联ID,如:

bd4b43747d42c5bec9af011d49de9db0.png

但是,还有另一种更简便的打印方式,既是MDC ( Mapped Diagnostic Contexts ) + AOP切面结合。MDC它是一个线程安全的存放诊断日志的容器。在处理请求前将请求的唯一标示放到MDC容器中,这个唯一标示会随着日志一起输出,以此来区分该条日志是属于那个请求的。并在请求处理完成之后清除MDC容器。

MDC对外提供的方法

508080c57dcd7a4fc41d6fe7f19c79d2.png

Logback配置

使用Logback的MDC机制,需要在logback.xml日志模板中进行一些设置,在logback.xml中,通过使用 %X{ }来占位,替换到对应的MDC中key的值。MDC容器的key可以多次赋值,每一次赋值会覆盖上一次的值。

884b2216c84d0f025a8ce016801362e8.png

MDC简单应用例子

4cfd1c24a0d9e1b4a28ddf06400d1ee3.png

往MDC容器中put入键值对,在日志打印时,日志会按照我们预先在logback.xml中的格式输出,而其中占位符会替换上MDC中对应key的value值。打印结果如下:

dfd457cfe8068b8851e855b0e3d2fde4.png

MDC与AOP切面的结合

如编写一个切面,被调用的服务在执行操作前,切面会将关键信息输出日志并同时将串联ID put到容器中,使其能在接下来同一线程内输出的日志中都包含该串联ID信息,在将日志串联起来的同时也方便了日志的打印。

c7bcec75836ba8be55338a522d276fa9.png

除了自定义切面外,Logback也提供了一个过滤器MDCInsertingServletFilter,感兴趣的朋友可以去详细了解下。

3b799e60c6896067686fa19fb7c28a80.png

管理每个线程的MDC容器

这里要特别要注意一点的是在主线程上,新起一个子线程,并由 java.util.concurrent.Executors来执行它时,在早期的版本中子线程可以直接自动继承父线程的MDC容器中的内容,因为MDC在早期版本中使用的是InheritableThreadLocal来作为底层实现。但是由于性能问题被取消了,最后还是使用的是ThreadLocal来作为底层实现。这样子线程就不能直接继承父线程的MDC容器。

举个例子:

8457f854079ee1960bffb25f281d09b8.png

例如:支付操作为异步时,网关接收了核心的支付请求后会新开一个线程去处理支付请求,并响应回核心受理成功(注意:这里受理代表接收到支付的请求,而不代表处理成功)。那这样做就会导致新的子线程MDC并没有继承父线程中的东西,导致响应结果时缺失串联ID信息,不能与支付请求关联起来。

解决方案

根据以上问题,Logback官方建议父线程新建子线程之前调用MDC.getCopyOfContextMap()方法将MDC内容取出来传给子线程,子线程在执行操作前先调用MDC.setContextMap()方法将父线程的MDC内容设置到子线程。

96ce7575608d03e3a312b5e51d5e4758.png

最后

以上就是分布式场景下一种较为不错的日志打印方式,通过结合AOP切面与Logback的MDC机制将多个系统间有关联的日志串联起来,有助于问题的排查及信息的查看。如果有其他不错的日志打印方式也欢迎提出,共同讨论学习。

感谢您的阅读,如果喜欢本文欢迎关注和转发,本头条号将坚持原创,持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 图类_Java集合类,一张图说清楚!

作者:skywang12345https://www.cnblogs.com/skywa...2019-03-23 10:32:24Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*,Java集合主要可以划分为4个部分…

python 取整_马克的Python学习笔记#数字,日期和时间

对数值进行调整在Python中对整数和浮点数进行数字计算是很容易的。但是,如果你需要对分数,数组或者日期和时间进行计算,这就会稍微复杂点。对于简单的取整操作,我们可以使用内建的round(value, ndigits)函数就可,举个例…

各路由协议的协议号_厂房转让协议

厂房转让协议转让方(甲方):________________受让方(乙方):________________甲乙双方本着平等互利的原则,经协商一致就甲方将其权属的工业用地、厂房等转让与乙方及有关事项达成如下协议:一、工业用地及厂房产权基本情况本协议转让的工业用地位…

java web开发常见问题_JavaWeb学习笔记(五)--Web开发其他常见问题

一、把web应用打成war包使用JDK自带jar命令,进入到web应用里面,执行命令:jar -cvf 包名.war . # .表示当前目录所有的文件 直接用jar可查看帮助执行完成后生成一个demo.war文件,把这个文件拷贝到Tomcat的webapps下,Tom…

uwsgi怎么通过浏览器访问某个脚本_4个Shell小技巧帮你提高机器学习效率:写好脚本,事半功倍...

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI在机器学习的实践过程中,用好Shell能帮你很多节省时间。最近,有位来自ETHZ的学生分享了一些Shell小技巧。对程序员来说,这些技巧更重要的是让你的思维从琐碎小事中解脱出来,大大提高…

间接寻址级别不同_被遗忘的利息税,国债与存款的利率区别,同大额存单的4点大不同...

2020年6月10日的储蓄式电子国债发行又一次与理财人擦肩而过,因为疫情管控原因,此次暂时不发行,那么下一个认购国债的窗口,就是7月10日,仍然是储蓄式电子国债,期限还是3年期和5年期两种。那么能如期发行吗&a…

抽象类可以用new创建对象吗_宠物可以用人类的湿巾吗?猫咪有泪痕可以用纸巾擦掉吗?...

宠物还有专用的湿巾?当然喽!不养宠物的小伙伴可能是无法理解的,人类的生活条件好了,宠物的生活条件在很多方面比人类还更上一层台阶呢!喜欢逛宠物店和宠物展的小伙伴都会有这样的感慨,那就是人生不如喵生狗…

java什么时候需要同步_JAVA中线程在什么时候需要同步和互斥

JAVA中线程在什么时候需要同步和互斥关注:265 答案:6 mip版解决时间 2021-01-27 08:10提问者时光易老2021-01-27 03:32JAVA中线程在什么时候需要同步和互斥?(假如这题是考试题,要怎样回答?)详细点最佳答案二级知识专家樱花雨梦2021-01-27 04:13例如访…

5g虚拟技术旅游_5G造就文旅新时代,驴迹科技探索智慧出行创新领域

随着我国5G技术的成熟与普及,5G为文旅产业提供新的解决方案,使之焕发新的活力。以5G“新基建”为依托,结合VR虚拟实境以及云计算、高清视频等技术交叉应用,对旅游业的发展带来广泛而深刻的影响,给游客更新鲜、更具有科…

分块排序算法 java_十大经典排序算法最强总结(含JAVA代码实现)

转载自:https://www.cnblogs.com/guoyaohua/p/8600214.html0、排序算法说明0.1 排序的定义对一序列对象根据某个关键字进行排序。0.2 术语说明稳定:如果a原本在b前面,而ab,排序之后a仍然在b的前面;不稳定:如…

synchronized锁升级_synchronized详解以及锁的膨胀升级过程

点击上方"码之初"关注,选择"设为星标"与精品技术文章不期而遇来源:www.cnblogs.com/cxiaocai/p/12189848.html架构之路远且艰辛,但是学习的脚步始终不能停止,今天聊一聊synchronized。synchronized是jvm内部的…

改变php二维数组的值_php如何修改二维数组中的值?

php修改二维数组中值的方法&#xff1a;1、通过【for($i 0; $i < count(Array()); $i)】语句修改&#xff1b;2、通过foreach($users as &$user)语句修改。php修改二维数组中值的方法&#xff1a;1、二维数组可以通过for($i 0; $i < count(Array()); $i)这种形式…

jlabel字怎么变化_怎样才能把字写好?详解最科学的练字方法及步骤

一&#xff1a;正确的学习之路1&#xff1a;临帖从古到今&#xff0c;临帖是学习书法最基本的方法&#xff0c;没有一个书法家是没有临过帖的。2&#xff1a;专注专注学一个书法家的字&#xff0c;专心致志&#xff0c;认真临写&#xff0c;持之以恒&#xff0c;直到形同神似。…

找不到具有指定id_JAVA如何整合es指定字段不分词搜索?

一、问题在做一个需求的时候&#xff0c;需要按照电话号码查询用户关系&#xff0c;所以我这边先讲相关信息同步到es&#xff0c;但是电话号码是加密的&#xff0c;所以显示的字符串是杂乱的&#xff0c;既有字母&#xff0c;又有斜杠等号等字符&#xff0c;在进行分词查询的时…

vant 项目_vueCli4+vant+router+vuex+移动端适配

教程的开始 各位同学请先安装node、npm、vuecli4 巴拉巴拉...废话不多说立即开始随便找个地方 cmd&#xff0c;powerShell也可以 命令行走起1. 创建vue项目 随便起个名字就叫my-vue吧&#xff0c;傻瓜式回车键就行&#xff0c;也可以根据自己的喜好选择eslint。vue create my-v…

电路结构原理_精密半波、全波整流电路结构原理图解

利用二极管(开关器件)的单向导电特性&#xff0c;和放大器的优良放大性能相结合&#xff0c;可做到对输入交变信号(尤其是小幅度的电压信号)进行精密的整流&#xff0c;由此构成精密半波整流电路。若由此再添加简单电路&#xff0c;即可构成精密全波整流电路。二极管的导通压降…

vlookup两个条件匹配_vlookup,你还是只会基础的单条件查找?

很多数据分析师在简历上都会说自己熟悉excel&#xff0c;但熟练使用excel必须要掌握的核心函数vlookup首当其冲&#xff0c;其次是sumifs、match、index等等。就算熟悉vlookup&#xff0c;很多人也只会基础的单条件查找&#xff0c;其实在工作中能用到vlookup的地方有很多&…

matlab 绘制符号函数,DAY8 MATLAB学习笔记—simulink入门、MATLAB符号函数的图形绘制...

如何打开simulink&#xff1a;启动simulink&#xff1a;先打开MATLAB软件界面第一步打开simulink第二步在command windows输入 simulink然后enter&#xff0c;等待有很多模块库第三步&#xff1a;常用的simulink库打开以后会看到simulink library browser这个界面最常用的就是s…

后盾网php多少钱_商标转让做公证花多少钱-购店网

当别人对您的商标感兴趣&#xff0c;或者您想买属于自己的商标时&#xff0c;转让商标是个好主意。但不了解商标转让流程的朋友&#xff0c;可能会担心自己对商标公证书的作用缺乏了解。所以今天我们给大家介绍一下什么是商标转让公证的用途&#xff0c;具体什么是商标公证。想…

MATLAB求线性代数的参数范围,MATLAB科学计算04(线性代数问题求解一)

文章目录特殊矩阵矩阵的基本概念求解线性方程组直接求解判定求解特殊矩阵零矩阵、1矩阵及单位矩阵生成nxn方阵&#xff1a;Azeros(n), Bones(n), Ceye(n)生成mxn矩阵&#xff1a;Azeros(m,n), Bones(m,n), Ceye(m,n)生成和矩阵B同样位数的矩阵&#xff1a;Azeros(size(B))**生成…