游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

切记,这样打日志定位Bug又快又准

  概述
  日常工作中,程序员需要经常处理线上的各种大小故障,如果业务代码没打印日志或者日志打印的不好,会极大的加大了定位问题的难度,使得解决bug的时间变长了。对于那种影响比较大的bug,处理时间是分秒必争的,慢几秒处理完,可能GMV就哗啦啦的掉了很多。
  一个程序员是否优秀,其中一个判断维度就是:处理线上问题是否快狠准,而其中日志是帮我们快速定位问题的绝佳手段。
  下面分享一下笔者平时在业务系统里记日志的一些手法和习惯,希望对大家有一些帮助。请统一日志格式
  日志格式最好是统一的,即方便查看定位问题又方便统计收集。我一般喜欢定义一个LogObject对象,里面定义日志的各个字段。例如:importcom。fasterxml。jackson。annotation。JsonInclude;importcom。fasterxml。jackson。annotation。JsonInclude。Include;importcom。fasterxml。jackson。annotation。JsonProperty;publicclassLogObject{JsonProperty(index1)privateStringeventName;JsonProperty(index2)privateStringtraceId;JsonProperty(index3)privateStringmsg;JsonProperty(index4)privatelongcostTime;JsonProperty(index6)privateIntegeruserId;JsonProperty(index7)privateObjectothers;JsonProperty(index8)privateObjectrequest;JsonProperty(index9)privateObjectresponse;publicStringgetEventName(){returneventName;}publicLogObjectsetEventName(StringeventName){this。eventNameeventName;returnthis;}publicObjectgetRequest(){returnrequest;}publicLogObjectsetRequest(Objectrequest){this。requestrequest;returnthis;}publicObjectgetResponse(){returnresponse;}publicLogObjectsetResponse(Objectresponse){this。responseresponse;returnthis;}publicStringgetMsg(){returnmsg;}publicLogObjectsetMsg(Stringmsg){this。msgmsg;returnthis;}publiclonggetCostTime(){returncostTime;}publicLogObjectsetCostTime(longcostTime){this。costTimecostTime;returnthis;}publicIntegergetUserId(){returnuserId;}publicLogObjectsetUserId(IntegeruserId){this。userIduserId;returnthis;}publicObjectgetOthers(){returnothers;}publicLogObjectsetOthers(Objectothers){this。othersothers;returnthis;}publicStringgetTraceId(){returntraceId;}publicLogObjectsetTraceId(StringtraceId){this。traceIdtraceId;returnthis;}
  traceId:调用链id
  eventName:事件名称,一般就是业务方法名称
  userId:C端用户id
  msg:结果消息
  costTime:接口响应时间
  request:接口请求入参
  response:接口返回值
  others:其他业务参数
  使用链式的风格,方便设置字段的值:longendTimeSystem。currentTimeMillis();LogObjectlogObjectnewLogObject();logObject。setEventName(methodName)。setMsg(msg)。setTraceId(traceId)。setUserId(backendId)。setRequest(liveRoomPushOrderReqDto)。setResponse(response)。setCostTime((endTimebeginTime));LOGGER。info(JSON。toJSONString(logObject));
  当然最好还是封装出一个工具类出来,例如叫:LogTemplate,作为一个统一的入口。另外可以使用JsonProperty注解,指定字段的顺序,例如通过index1,将eventName放置在最前面。JsonProperty(index1)privateStringeventName;将request和response放置在一起
  将请求和返回值,放置在同一条日志里,有个好处,就是非常方便查看上下文日志。如果打印成两条,返回值那条可能被冲到很后面,而且也得再做一次grep操作,影响效率。
  具体的日志如下:{eventName:createOrder,traceId:createOrder1574923602015,msg:success,costTime:317,request:{uId:111111111,skuList:〔{skuId:22222222,buyNum:1,buyPrice:8800,}〕},response:{code:0,message:操作成功,data:{bigOrderId:BIG2019,m2LOrderIds:{MID2019:{22222222:LIT2019}}}}}
  为了能拼成一条,有两种方案,一种是比较low的,直接在代码里使用trycatchfinally,例如:PostMapping(valuecreateOrder)publicJsonResultcreateOrder(RequestBodyObjectrequest)throwsException{StringmethodNamecreateOrder;IntegerbackendIdnull;Stringmsgsuccess;longbeginTimeSystem。currentTimeMillis();StringtraceIdcreateOrderbeginTime;JsonResultresponsenull;try{OrderCreateRsporderCreateRsporderOperateService。createOrder(request,traceId);responseJsonResult。success(orderCreateRsp);}catch(Exceptione){msge。getMessage();LOGGER。error(methodName,userId:backendId,request:JsonHelper。toJson(request),e);thrownewBizException(0,下单失败);}finally{longendTimeSystem。currentTimeMillis();LogObjectlogObjectnewLogObject();logObject。setEventName(methodName)。setMsg(msg)。setTraceId(traceId)。setUserId(backendId)。setRequest(request)。setResponse(response)。setCostTime((endTimebeginTime));LOGGER。info(JSON。toJSONString(logObject));}returnresponse;}
  这种方案呢,有个缺点,就是每个业务方法都得处理日志,更好的方案是使用aop加threadlocal的方式,将请求统一拦截且将返回值和请求参数串起来,这个网络上的方案很多,这里就不阐述了。
  对于对性能要求比较高的应用,反而推荐第一种方案,因为使用aop,有一些性能损耗。像我之前在唯品会参与的商品聚合服务,用的就是第一种方案,毕竟每一秒要处理上百万的请求。另外,附送学习资源:Java进阶视频资源日志里加入traceId
  如果应用中已经使用了统一调用链监控方案,且能根据调用链id查询接口情况的,可以不用在代码里手动加入traceId。如果应用还没接入调用链系统,建议加一下traceId,尤其是针对聚合服务,需要调用中台各种微服务接口的。像聚合层下单业务,需要调用的微服务就有如下这么些:营销系统订单系统支付系统
  下单业务调用这些接口的时候,如果没有使用traceId进行跟踪的话,当下单失败的时候,到底是哪个微服务接口失败了,就比较难找。下面以小程序端,调用聚合层下单接口的例子作为展示:营销系统{eventName:pmsgetInfo,traceId:createOrder1575270928956,msg:success,costTime:2,userId:1111111111,request:{userId:1111111111,skuList:〔{skuId:2222,skuPrice:65900,buyNum:1,activityType:0,activityId:0,}〕,},response:{result:1,msg:success,data:{realPayFee:100,}}}订单系统{eventName:orderservicecreateOrder,traceId:createOrder1575270928956,msg:success,costTime:29,userId:null,request:{skuList:〔{skuId:2222,buyNum:1,buyPrice:65900,}〕,},response:{result:200,msg:调用成功,data:{bigOrderId:BIG2019,m2LOrderIds:{MID2019:{88258135:LIT2019}}}}}支付系统{eventName:payservicepay,traceId:createOrder1575270928956,msg:success,costTime:301,request:{orderId:BIG2019,paySubject:测试,totalFee:65900,},response:{requestId:test,code:0,message:操作成功,data:{payId:123,orderId:BIG2019,tradeType:JSAPI,perpayId:test,nonceStr:test,appId:test,signType:MD5,sign:test,timeStamp:1575270929}}}
  可以看到聚合层需要调用营销、订单和支付三个应用的接口,调用的过程中,使用traceId为createOrder1575270928956的串了起来,这样我们只需要grep这个traceId就可以把所有相关的调用和上下文找出来。
  traceId如何生成呢,一种简单的做法是,使用System。currentTimeMillis()加上业务接口名字,如:longbeginTimeSystem。currentTimeMillis();StringtraceIdcreateOrderbeginTime;加traceId会侵入到业务方法里,比如说:publicvoidcreateOrder(Objectobj){longbeginTimeSystem。currentTimeMillis();StringtraceIdcreateOrderbeginTime;pmsService。getInfo(obj,traceId);orderService。createOrder(obj,traceId);payService。getPrepayId(obj,traceId);}
  像pmsService这些内部的service方法,都需要加一个traceId字段,目前我觉得还好,要是觉得入侵了,也可以考虑threadlocal的方式,处理请求的时候,为当前线程存储一下traceId,然后在业务方法里,再从当前线程里拿出来,避免接口方法里的traceId满天飞。

宝马iX3被迫官降7w,如今X3又添强敌,V6引擎可调悬架提到豪华品牌中的宝马,相信大家都非常熟悉,作为豪华品牌中的典型,宝马也是颇受消费者追捧,不过前段时间华晨宝马在推出新车iX3这款车之后不久,华晨宝马官方就发布通告,宣布新车宝马……电气运行试题十三47。什么是电流互感器将大电流按规定比例转换成小电流的设备或特殊变压器称为电流互感器电流互感器的二次侧一般为5A和1A,以供电流表。功率表。电能表。和继电器的的电流线圈所需的电……新时代就要二次元,年轻人都爱这款车二次元是一个ACGN亚文化圈专门用语,不管二次元有什么样的呈现形式和内容表达,其实核心都是对梦想生活的憧憬和对美好未来的期望。在这个科技和审美取向多元化的时代,二次元甚至开始走……网传阿里旗下淘小铺是传销平台,你怎么看?淘小铺是淘宝开发的一款定义为社交电商平台的APP,以用户淘宝账户开通加入淘小铺,即可实现属于自己的小店,也就是店主。通过分享商品及邀请好友加入淘小铺成为店主,成长阶段是体验掌柜……OPPOReno6标准版性能不够用?实测天玑900体验有惊喜最近,OPPOReno6系列终于在众多消费者期待的目光中隆重登场了,颜值方面依然是不负众望,延续了前代机型的高颜值水准的同时还有升级,而视频拍摄能力的提升,大家也可以放心,毕竟……跑高速如何确保安全?交通部门提醒做好这4件事才行跑高速看似简单,实则暗藏风险,不管是新手还是老司机,都应该时刻保持警惕做到安全驾驶。高速公路上,事故的发生往往只有短短几秒钟,凭临时反应很难化险为夷。若要确保安全,必须要提前储……紧急通知!重疾险停售之后,医疗险也要停售了?大家好,我是老李。今天和大家聊聊医疗险的停售传闻。1月11日,中国银保监会发出通知,要求保险公司规范短期健康险的经营管理行为,直接引发一大波医疗险地震。不符合……扬中华健儿朝气,树民族品牌之风!九牧王打造中国红礼服7月23日晚,第32届夏季奥林匹克运动会开幕式在日本东京隆重举行,当一抹鲜亮的中国红登场,立刻引发国内网友热议,直呼中国红yyds。中国体育代表团身着九牧王匠心缔造的中国红礼服……开启无线世界试水蓝牙影音这两款EDUP无线网卡可以轻松做到老旧台式机,连不了无线网络,也没有蓝牙功能,空有WiFi热点和蓝牙音箱却无用武之地。半夜摸黑洗手被网线绊到差点失禁,戴耳机听歌被勒出耳廓淤青,通往无线世界的大门已被焊死,……你遇见的人,都是来渡你的作者:瑾杨来源:十点读书佛说:前世不欠,今生不见;若无相欠,怎会相见。出现在你生命中的每个人,都是带着使命而来,或爱你、帮助你、成就你;或伤你、锤炼你、圆满你……路特斯EMIRAGT4官图发布赛车化改装唯轻不破日前,根据相关渠道信息:路特斯EMIRAGT4赛车官图被曝光。新车相比常规车型更注重赛道竞技性能的提升,不仅配备了性能更出色的空气动力学套件,还进一步将整车重降低至1260kg……荣耀V40价格泄露,是烟雾弹也是真实价格原计划1月18号发布的荣耀V40,因场地原因跳票到1月22日发布,但是爆料却没有跳票,今日关于荣耀V40的诸多信息被曝出,包括外观,相机详细参数,甚至是价格,其中曝出的价格争议……
哈啰出行多元豪赌?200亿背后杨磊警惕造势不造血作者:李晴雨编辑:贺婧风品:沈禾车一来源:首财首条财经研究院潮起潮落,商海多浮沉。想来,共享单车业应有更多体会。热钱褪去,行业洗尽铅华,从业者也在……石头自清洁扫拖机器人G10体验科技究竟能让人懒到什么程度?两天前我体验了石头首款智能双刷洗地机U10,立刻有粉丝在后台表示,我们懒人是不会自己动手的!专门瞄准懒人经济的石头当然早就想到了这一点,和洗地机同时到来的,还有一款自清洁扫拖机……国家再次出手!为何互联网巨头垄断被盯上了?9月9日,一场对互联网影响深远的会议在工信部组织下召开。阿里巴巴、腾讯、字节跳动、百度、华为、小米、陌陌、360、网易等企业参会,会议主题是关于通信屏蔽网址链接等问题。9……聚焦在鸿蒙生态,华为HDC开发者大会是一场属于开发者自己的盛华为开发者大会(HDC)是华为面向全球开发者的年度盛会,今年的华为开发者大会(HDC)将于10月22日10月24日在东莞松山湖举行,此次大会可以会有鸿蒙生态、HMSCore6。……9月下旬发布的2000档位新机,哪款是你的心仪之选?去年3月份,经历过一波新机热潮,没想到眨眼又过去了好几个月,瞬间就来到9月份了。在这个时间点,又将是一波2000档位机型的发布热潮,很多都是瞄准了双11期间的中端手机市场,手持……选企业培训系统软件应该关注哪几个方面?我推荐企慧通企业培训考试系统,在人员管理和成长模式上有很大的优势。通过互联网建立的企业线上线下结合的平台,帮助企业科学化的管理,帮职工量身打造培训计划。系统遵循ISO10……华为参与IPFS建设华为参与投资IPFS肯定是因为看到了IPFS技术的发展潜力呀!IPFS作为新一代互联网底层协议,提供去中心化存储服务,对标传统互联网协议。相较之下IPFS以安全性,高效率,快速……下半年旗舰守门员来了骁龙870120HzOLED屏,价格19通常情况下,我们说的旗舰手机主要是包括两种产品,一种为高端旗舰,一种为次旗舰。高端旗舰并不难理解,就是从性能、影像到屏幕、续航、快充等诸多方面都搭载了行业最顶级的天花板技……被喷得越狠,销量就越高,新能源汽车走黑红路线?新能源汽车曾经,买车没有现在这么多选择,除了燃油车,还是燃油车。如今,在相关政策的趋势下,新能源汽车应运而生,也让购车有了另一种选择。选择是多了,但吐槽声也多。毫不……哈啰打车接入享道T3等服务聚合打车模式再升级?新京报贝壳财经讯(记者陈维城)12月28日,哈啰出行旗下哈啰打车宣布,升级运力合作平台为品牌联盟,并接入享道出行、T3出行、如祺出行等多家出行企业。加上此前已达成合作的曹操出行……旧电脑怎么处理?在这个日新月异的时代中,现阶段电脑的更新换代的速度越来越快,而人们也极致的追求新的电脑给自己带来的享受。硬件配置、电脑的外观形状变得越来约好,所以,人们就想拥有更好的电脑,而以……安全高效,从容办公紫光计算机Unis526TG2评测相信很多人都对紫光计算机进入商用PC市场有所耳闻,也希望对具体产品有更多了解。事实上紫光计算机在去年就已经推出了第一代产品。近日,紫光计算机在商用PC市场继续发力,带来其第二代……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网