专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

生产环境定位日志太麻烦怎么办?建议了解一下日志框架的MDC功

  对于每一个开发者来说,查询接口的执行日志都是一个高频率的操作,每当测试说接口有问题时,我们都需要去服务器或者日志系统上查报错的原因。
  一般情况下,我们会通过对应的关键字或者接口地址去查询这个接口到底报了什么错,但是这带来一个问题,就是我们可能少打日志或者忘打某些关键字的日志,导致查询记录比较麻烦。
  那么有没有一种简单高效的方法,即使我们在日志中不打印任何关键字,系统会自动生成一个关键字,让我们一次性查询出这个接口的所有log记录呢?MDC
  MDC是日志门面框架SLF4J提供的一个类,可以提供在多线程情况下记录日志的功能,log4j、logback、log4j2都有对这个类的实现。
  从本质上来说,MDC可以看做一个ThreadLocal,由于其线程安全的特性,可以让我们轻松安全的保存数据。
  MDC主要的API有clear()、get()、put()、remove()方法等,简洁的api让我们使用上手基本没有难度。如何使用
  1,修改日志打印格式
  以日志框架logback为例,在logback。xml中,找到日志打印规则的配置,添加X{reqId}属性,其中reqId可以任意指定,你写其他的属性也可以,博主这里演示指定为reqId。encoderpatternX{reqId}d{yyyyMMddHH:mm:ss。SSS}〔thread〕5levelfile:linemsgnpatterncharsetUTF8charsetencoder
  2,添加过滤器MDCFilter
  ps。使用拦截器也可以,效果是一样的。对每个接口做拦截。ComponentAllArgsConstructorOrder(Ordered。HIGHESTPRECEDENCE)Slf4jpublicclassMDCFilterimplementsFilter{Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain){try{给每个请求接口生成一个requestIdStringrequestIdRandomUtil。randomNumbers(10);这里的reqId就是上面配置的,要保持一致MDC。put(reqId,reqId:requestId);chain。doFilter(request,response);}finally{MDC。clear();}}Overridepublicvoiddestroy(){}}
  经过简单的两步就配置好了,下面我们看一下效果。PostMapping(valuemdcTest)publicResponseEntityObjectmdcTest(Stringid,Stringname){log。info(测试ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a打印,id{},name{},id,name);log。info(测试ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a打印1);log。info(测试ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a打印2);log。info(测试ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a打印3);log。info(测试ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a打印4);returnResponseEntity。ok()。build();}
  每一行日志都有一个关键字reqId:9723829830,这样我们查询日志时只需要查询关键字9723829830就可以直接查出来这个接口所有的执行记录了。
  如果想更方便的话,也可以把这个关键字直接输出到每一个接口的响应头或者响应体中。进阶使用
  对于普通的web应用我们可以直接拦截每个接口,自动生成一个请求id,那么对于微服务项目,一个接口可能会产生很多服务的调用,那如何一次性查出来所有系统内的日志呢?
  对于日志的搜集本文暂不考虑,咱们先说如何做请求id的传递。
  其实也很简单,当我们有多个系统间的调用时,把reqId放到request的header中进行传递,然后下游系统获取这个id就可以了。
  比如下方的拦截器:publicclassLogInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{如果有上层调用就从header中取出上层的IDStringtraceIdrequest。getHeader(reqId);if(traceIdnull){如果没有,就生成一个默认的traceIdRandomUtil。randomNumbers(10);}MDC。put(reqId,traceId);returntrue;}OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{调用结束后删除MDC。remove(reqId);}}MDC存在的一些问题
  我们在上文说过,MDC的本质是ThreadLocal,它会把数据都绑定到当前线程上。但是当我们使用多线程的时候,就会带来一个数据丢失的问题。
  所以,我们需要进行线程间的数据传递,保证MDC数据不丢失。
  以线程池传递数据为例,ThreadPoolTaskExecutor提供了一个taskDecorator装饰器,通过这个属性,我们就可以实现属性的传递。
  首先,定义一个MDCContextDecorator,publicclassMDCContextDecoratorimplementsTaskDecorator{OverridepublicRunnabledecorate(Runnablerunnable){MapString,StringpreviousMDC。getCopyOfContextMap();return(){try{if(previous!null){MDC。setContextMap(previous);}runnable。run();}finally{MDC。clear();}};}}
  然后设置线程池的taskDecorator属性,publicThreadPoolTaskExecutorexecutor(){ThreadPoolTaskExecutorexecutornewThreadPoolTaskExecutor();executor。setCorePoolSize(5);executor。setMaxPoolSize(20);。。。其他属性设置线程属性的自动传递executor。setTaskDecorator(newMDCContextDecorator());returnexecutor;}最后
  MDC的使用其实很简单,对于我们查询日志也很有帮助,应用也算是非常广泛了。有兴趣的同学也可以去看一下它的内部实现,代码也并不复杂。
  头条创作挑战赛
  我是程序员拾山,欢迎关注我,期待与大家一起学习成长,也感谢您的点赞和关注。

国际首个!四星编队似车轮四颗卫星像在太空飞行的车轮。央视新闻供图3月30日18时50分,我国在太原卫星发射中心使用长征二号丁运载火箭,成功将宏图一号01组卫星发射升空,卫星顺利进入预定轨道,发射任务获得圆天文学家发现超大黑洞,质量是太阳的300亿倍!英国天文学家使用新技术发现了一个超大质量黑洞,是迄今为止被发现的最大黑洞之一。皇家天文学会发表的研究结果表明,这个黑洞的质量是太阳质量的300多亿倍。研究人员将其描述为一个令人极度室温超导离我们还有多远漫谈将会为人类社会带来革命性变化的常温超导(简写版)文陈思进近日,罗彻斯特大学的兰加迪亚斯教授在美国物理学会会议上宣布,在近环境压强下实现了室温超导。随后,我国南京大学超导物理和材神舟十四号乘组讲述183天在轨飞行经历星空与我相伴,祖国和我守望(讲述特别策划)来源人民日报图神舟十四号乘组向国旗敬礼。图空间站示意图。中国载人航天工程办公室供图图陈冬在太空拍摄的月球。图刘洋在太空拍摄的地球美景。图神舟十四号乘组和神舟十五号乘组胜利会师。图由3月30号凌晨苹果正式官宣WWDC23开发者大会3月30号凌晨苹果正式官宣WWDC23开发者大会举办时间,会在北京时间6月6日凌晨1点整举行,明辰估计等到发布会结束后,苹果就会向开发者推送iOS17。0Beta内测版,但是果粉们NAS爱好者注意看!DIY多功能小主机软硬件打造教程前言家里服役多年作为NAS角色的DELL服务器莫名其妙的坏掉了,猜测很可能是在挖矿横行的年代过分透支精力所造成。好在本人一直非常看重数据的安全性,坚持使用RAID卡并不惜牺牲一半存日媒新型耳机让软骨充当扩音器参考消息网4月1日报道据日本东京新闻3月24日报道,一种全新的耳机原理正在受到关注,这就是由奈良县立医科大学校长细井裕司发现的软骨传导模式。软骨传导原理有望应用于手机等IT设备,也一图定音!剧情反转堪比无间道!一加手机确实有点不太行最近小米高管王腾有点忙,在自证的这条路上,估计他自己都没想到事情会变得如此麻烦。起因是在3月28日红米发布会当晚,小米高管王腾发布微博称有用户看完发布会后,将新买的一加Ace2以旧清理电脑C盘多种方法,以及两款神器清理电脑C盘的方法有很多,以下是一些常用的方法卸载不必要的程序打开控制面板,选择程序和功能,卸载不需要的程序。清理临时文件在文件资源管理器中打开C盘,进入Windows文件夹,然后足球经理202323。4大型更新现已上线足球经理2023(PCMac)23。4版本的大型数据更新现已上线,和冬季转会窗口后更新阵容的球队们较量一番吧!大型数据更新已在FM23(Xbox和PS5),FM23Touch(Ap热血江湖手游内测最新消息,团队中不可或缺的的职业是谁?3D武侠网游热血江湖改编自同名人气漫画,拥有十三大人气职业供玩家选择。各个职业玩法不同,每个职业都有其擅长的方面和特色,不同的职业组合可以在副本和战场上应对不同的情况和局面。而在这
再刷中国自动驾驶纪录,毫末城市NOH将于2022年下半年上市中国首个大规模量产城市导航辅助驾驶系统毫末城市NOH来了!8月26日,在2022成都国际车展首日魏牌摩卡的发布会现场,魏牌官宣搭载毫末智行城市NOH辅助驾驶系统的魏牌摩卡DHTPHMySQL百万级数据插入效率优化场景由于压力测试,您需要在数据库中检索大量数据,但数据库中没有太多数据。于是为了测试,就得往数据库里快速插入大量的临时数据。有两种方法可以快速插入大量数据一种是使用Java代码实现调整好心态,好好生活,努力工作我们每个人都是独一无二的存在。谁的生活不苦?谁的工作不累?为了更好的生活,我们都在努力的拼搏。我们想要怎样的生活,就努力的付出行动。日复一日,年复一年,坚持,坚持,在坚持。每个成功再刷中国自动驾驶纪录,毫末城市NOH将于2022年下半年上市中国首个大规模量产城市导航辅助驾驶系统毫末城市NOH来了!8月26日,在2022成都国际车展首日魏牌摩卡的发布会现场,魏牌官宣搭载毫末智行城市NOH辅助驾驶系统的魏牌摩卡DHTPHMySQL百万级数据插入效率优化场景由于压力测试,您需要在数据库中检索大量数据,但数据库中没有太多数据。于是为了测试,就得往数据库里快速插入大量的临时数据。有两种方法可以快速插入大量数据一种是使用Java代码实现调整好心态,好好生活,努力工作我们每个人都是独一无二的存在。谁的生活不苦?谁的工作不累?为了更好的生活,我们都在努力的拼搏。我们想要怎样的生活,就努力的付出行动。日复一日,年复一年,坚持,坚持,在坚持。每个成功TOPBRAND糖茶HappyViking获融资洪九果品今起招股SeesawCoffee推出生椰系列新品编辑阳子最新融资糖茶完成千万级天使轮战略融资近日,茶饮新贵品牌糖茶完成千万级天使轮战略融资,由天智投资领投。本次融资将主要用于品牌拓展品牌建设产品研发打造品牌供应链等方面。糖茶是一奇瑞小蚂蚁首年养车成本分析,你认为如何?如果问你电动车和燃油车哪个车型的用车成本高,相信你肯定会毫不犹豫地脱口而出电动车。自电动车型进入国内市场开始,大家就开始宣传电动车养车费用低,不用换机油机滤清理积碳等一系列保养项目TOPBRAND糖茶HappyViking获融资洪九果品今起招股SeesawCoffee推出生椰系列新品编辑阳子最新融资糖茶完成千万级天使轮战略融资近日,茶饮新贵品牌糖茶完成千万级天使轮战略融资,由天智投资领投。本次融资将主要用于品牌拓展品牌建设产品研发打造品牌供应链等方面。糖茶是一奇瑞小蚂蚁首年养车成本分析,你认为如何?如果问你电动车和燃油车哪个车型的用车成本高,相信你肯定会毫不犹豫地脱口而出电动车。自电动车型进入国内市场开始,大家就开始宣传电动车养车费用低,不用换机油机滤清理积碳等一系列保养项目新加坡证券交易所将有更多在美上市的中国公司从新加坡上市新加坡证券交易所认为,未来几个月将有很多已经在美国上市的中国公司从新加坡上市。新加坡交易所有限公司首席执行官罗文才表示,继蔚来5月在新加坡进行技术性上市后,可以预期其他中国公司也会
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网