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

Java故障诊断使用日志调查问题

  像其他调查技术一样,使用日志在某些情况下有意义,而在其他情况下则没有意义。在本文中,我们将研究使用日志可以帮助你更容易理解软件行为的各种情况。我们将首先讨论日志信息的几个关键点,然后分析这些特征如何帮助开发者调查应用程序的问题。
  日志信息的最大优势之一是,它可以让你直观地看到某段代码在特定时间的执行情况。当你使用debugger时,正如我们在前面文章中讨论的那样,你的注意力主要集中在现在。当debugger暂停某一行代码的执行时,你看的是数据的样子。debugger不会给你很多关于执行历史的细节。你可以使用执行stack跟踪来确定执行路径,但其他一切都集中在当前。
  相比之下,日志关注的是应用程序在过去一段时间的执行情况(图1)。日志信息与时间有密切关系。
  图1
  记住要考虑你的应用程序所运行的系统的时区。由于时区不同,日志时间可能会有几个小时的偏移(例如,在应用程序运行的地方和开发者所在的地方之间),这可能会造成混淆。
  注意
  始终在日志消息中包含时间戳。你将使用时间戳来轻松识别消息被记录的顺序,这将使你了解应用程序何时写了某条消息。我建议将时间戳放在消息的第一部分(开头)。使用日志来识别异常情况
  日志可以帮助你在问题发生后发现问题,并调查其根本原因。通常,我们使用日志来决定从哪里开始调查。然后,我们继续使用其他工具和技术来探索问题,如debugger或profiler。你通常可以在日志中找到异常stack的痕迹。下一个片段显示了一个Java异常stack跟踪的例子:java。lang。NullPointerExceptionatjava。basejava。util。concurrent。ThreadPoolExecutorrunWorker(ThreadPoolExecutor。java:1128)〔na:na〕atjava。basejava。util。concurrent。ThreadPoolExecutorWorkerrun(ThreadPoolExecutor。java:628)〔na:na〕atorg。apache。tomcat。util。threads。TaskThreadWrappingRunnablerun(TaskThread。java:61)〔tomcatembedcore9。0。26。jar:9。0。26〕atjava。basejava。lang。Thread。run(Thread。java:830)〔na:na〕
  在应用程序的日志中看到这个异常stack跟踪,或类似的东西,会告诉你某个功能可能出了问题。每个异常都有自己的含义,可以帮助你确定应用程序在哪里遇到了问题。例如,一个NullPointerException告诉你,某条指令通过一个不包含对象实例引用的变量引用了一个属性或方法(图2)。
  图2
  注意
  记住,异常发生的地方不一定是问题的根源所在。异常告诉你哪里出了问题,但异常本身可能是其他地方的问题的结果。它不一定就是问题本身。不要通过添加trycatchfinally块或ifelse语句,太快地做出在本地解决异常的决定。首先,在寻找解决问题的方案之前,要确保你了解问题的根本原因。
  我经常发现,这个概念让初学者感到困惑。让我们来看看一个简单的NullPointerException,这可能是所有Java开发者遇到的第一个异常,也是最容易理解的一个。然而,当你在日志中发现一个NullPointerException时,你首先需要问自己:为什么这个引用会缺失?它的缺失可能是因为应用程序之前执行的某条指令没有达到预期的效果(图3)。
  图3使用异常stack跟踪来确定什么在调用一个方法
  开发人员认为不寻常的技术之一,但我发现在实践中很有优势,那就是记录异常stack跟踪,以确定是什么在调用一个特定的方法。自从开始我的软件开发者生涯以来,我一直在与(通常)大型应用程序的混乱代码库打交道。我经常遇到的困难之一是,当一个应用程序在远程环境中运行时,要弄清楚谁在调用某个特定的方法。如果你只是阅读应用程序的代码,你会发现该方法有数百种可能被调用的方式。
  当然,如果你足够幸运,并且有权限,你可以使用《Java故障诊断远程调试应用》中讨论的远程窃听。然后你可以访问debugger提供的执行stack跟踪。但如果你不能远程使用debugger呢?在这种情况下,你可以使用日志技术来代替!
  Java中的异常有一个经常被忽视的作用:它们可以跟踪执行stack的痕迹。在讨论异常的时候,我们经常把执行stack跟踪称为异常stack跟踪。但说到底,它们是同样的东西。异常stack跟踪显示了导致特定异常的方法调用链,即使没有抛出那个异常,你也可以获得这些信息。在代码中,只要使用异常就足够了:newException()。printStackTrace();
  考虑一下清单1中的方法。如果你没有调试器,你可以简单地打印异常堆栈跟踪,就像我在这个例子中所做的那样,作为方法的第一行来查找执行堆栈跟踪。请记住,这只是打印stack跟踪,并没有抛出异常,所以它不会干扰执行的逻辑。这个例子是在https:gitee。comtuntejavatroubleshootingsample。git项目dach5ex1中。
  清单1使用异常打印日志中的执行stack跟踪publicListIntegerextractDigits(){newException()。printStackTrace();PrintstheexceptionstacktraceListIntegerlistnewArrayList();for(inti0;iinput。length();i){if(input。charAt(i)0input。charAt(i)9){list。add(Integer。parseInt(String。valueOf(input。charAt(i))));}}returnlist;}
  下一个片段显示了应用程序如何在控制台中打印出异常stack跟踪。在现实世界中,stack跟踪可以帮助你立即确定执行流程,从而导致你想要调查的调用。在这个例子中,你可以从日志中看到,extractDigits()方法是在Decoder类的第11行从decode()方法中调用的:java。lang。Exceptionatmain。StringDigitExtractorextractDigits(StringDigitExtractor。java:15)atmain。Decoder。decode(Decoder。java:11)atmain。Main。main(Main。java:9)测量执行特定指令所花费的时间
  日志信息是衡量一组给定指令执行时间的简单方法。你可以随时记录某一行代码前后的时间戳的差异。假设你正在调查一个性能问题,其中一些给定的能力需要太长时间来执行。你怀疑其原因是应用程序执行的一个查询,以从数据库中检索数据。对于某些参数值,查询很慢,这降低了应用程序的整体性能。
  为了找到导致问题的参数,你可以把查询和查询的执行时间写入日志。一旦你确定了有问题的参数值,你就可以开始寻找解决方案了。也许你需要给数据库中的某个表多加一个索引,也许你可以重写查询,使其更快。
  清单2告诉你如何记录执行一段特定代码所花费的时间。例如,让我们计算一下应用程序运行从数据库中查找所有产品的操作需要多少时间。是的,我知道,我们这里没有参数;我简化了这个例子,让你把注意力集中在所讨论的语法上。但在一个真实世界的应用程序中,你很可能会调查一个更复杂的操作。
  清单2记录某一行代码的执行时间publicTotalCostResponsegetTotalCosts(){TotalCostResponseresponsenewTotalCostResponse();记录方法执行前的时间戳longtimeBeforeSystem。currentTimeMillis();执行我们要计算执行时间的方法varproductsproductRepository。findAll();计算执行后的时间戳和执行前的时间戳之间所花费的时间longspentTimeInMillisSystem。currentTimeMillis()timeBefore;打印执行时间log。info(Executiontime:spentTimeInMillis);varcostsproducts。stream()。collect(Collectors。toMap(Product::getName,pp。getPrice()。multiply(newBigDecimal(p。getQuantity()))));response。setTotalCosts(costs);returnresponse;}
  精确测量一个应用程序执行一个给定指令所花费的时间是一个简单而有效的技术。然而,我只在调查问题时暂时使用这种技术。我不建议你在代码中长期保留这样的日志,因为它们很可能以后就不需要了,而且它们会使代码更难读。一旦你解决了问题,不再需要知道那行代码的执行时间,你就可以删除这些日志。调查多线程架构中的问题
  多线程架构是一种使用多个线程来定义其功能的能力,通常对外部干扰很敏感(图4)。例如,如果你使用debugger或profiler(干扰应用程序执行的工具),应用程序的行为可能会改变(图5)。
  图4
  图5
  然而,如果你使用日志,应用程序在运行时受到影响的机会就会更小。日志有时也会干扰多线程的应用程序,但它们对执行的影响不大,不足以改变应用程序的流程。因此,它们可以成为检索你的调查所需数据的解决方案。
  由于日志信息包含一个时间戳,你可以对日志信息进行排序,以找到操作执行的顺序。在Java应用程序中,记录执行某条指令的线程名称有时很有帮助。你可以通过以下指令获得当前执行的线程的名称:StringthreadNameThread。currentThread()。getName();
  在Java应用程序中,所有线程都有一个名字。开发者可以为它们命名,或者JVM将使用Threadx模式的名称来识别线程,其中x是一个递增的数字。例如,创建的第一个线程将被命名为Thread0;下一个是Thread1;以此类推。正如我们在后续的文章讨论threaddump时所说的,命名应用程序的线程是一个很好的做法,这样你在调查一个案例时就可以更容易地识别它们。

8点1氪雷军称小米成电车前五才能成功特拉斯宣布辞去英国保守党TOP3大新闻雷军:小米造车成功唯一途径是挤进世界前五,年出货超千万辆10月19日晚,小米集团创始人雷军在社交媒体上发表了自己对电动汽车行业的看法,称相信当电动汽车……iPhone14Pro常亮显示屏将包含更多锁屏元素iPhone14Pro的常亮显示屏如何工作的更多细节已经浮出水面,新的iOS16锁屏与硬件功能深度集成。长期以来,一直有传言称下一代iPhone将提供某种形式的始终在线的……重磅消息不断,交易大门才刚刚拉开帷幕今年这个休赛期的交易大门刚刚打开,就不断有重磅消息传出。欧文好不容易下定决心下赛季好好和杜兰特一起打个球,杜兰特睡了一觉醒过来就和蔡老板说我要走了,你说这让欧文内心作何感……别急着拉宝宝学走路,走路太早也有危害,家长们可别好心办坏事别急着拉宝宝学走路,走路太早也有危害,家长们可别好心办坏事慈母手中线、游子身上衣,每一个孩子都是爸爸妈妈捧在手心里的优乐美,父母的喜怒哀乐也会随着孩子的成长变化而变化,尤……养生顺序很重要健脾先放屁,梳肝先流泪。中医上有句话叫做健脾先放屁。很多人不理解这是什么意思。今天就给大家解释一下这句话。这句话中的意思:首先健脾先放屁。中医上讲脾胃是主运化和消化的,当……支付宝中的小红点可以取消了请把我设为关注吧每天第一时间获取精彩内容昨天,就有网友在后台问我,支付宝首页底部的那个红点怎么关闭?经过迪克查看,还真找到了,如果你选择关闭的话,那么支付宝就会变得……中国各省市特产合集(一)一、北京北京是一座历史悠久的文化名城,不仅旅游资源十分丰富,而且还拥有各种特产。那么,北京有什么特产呢?本文整理了北京十大特产,包括美食特产北京烤鸭、特产名酒二锅头、传统……辽宁VS上海双雄逐鹿!大王郭少尴尬碰面杨鸣出师有名CCTV5CBA联赛已经进行到了36轮的焦点对决,眼看还有最后三场比赛就将结束常规赛的争夺,所有球队正在抓紧一切机会全力冲刺。本轮比赛当中,辽宁和上海的二番战成为了焦点赛事,本场比赛可以……PGA锦标赛佩雷拉T3今天真的紧张了北京时间5月23日,2022PGA锦标赛在在俄克拉荷马州的南山乡村俱乐部结束全部争夺。移动日的领先者智利人米托佩雷拉以9杆最后一组出发,但最终由于18洞的下水离奇失误,最后交出……哪些食物有助于消散结节?4种食物了解一下茄子茄子是日常生活中一种常见的事物,不仅美味,而且富含维生素和多种微量物质。对于一些甲状腺结节患者,平时吃一些茄子,可以起到促进血液循环和分散结节的作用,促进内分泌……雪藏威少!湖人仍难逃4连败,哈姆痛心疾首,詹姆斯还想甩锅一胜难求,开季4连败,西部倒数第一,俯冲追文班亚马,没关注NBA比赛的,还以为这是哪支摆烂球队的糟糕现状。别误会,这是没落豪门湖人队的真实写照,纵观整个联盟,他们都挑不出……瑞表鉴赏之英纳格手表AR410机芯保养,漂亮头条创作挑战赛序英纳格,玩老表的人,绕不过的一个品牌,作为瑞表几乎可以算是入门级的品牌,他就和天梭一样,有便宜的,有贵的,不管是哪一种选择,总有你喜欢的菜!比……
不超2000元,酷比魔方安卓旗舰平板电脑价格曝光配高通骁龙芯感谢IT之家网友TI小智的线索投递!IT之家3月22日消息近期,酷比魔方宣布将推出年度旗舰安卓平板,搭载高通骁龙芯片处理器,支持QC快充。在微信号的相关问答中,酷比……腾讯QQ音乐安卓版App更新适配魅族手机状态栏长歌词IT之家9月3日消息近期,腾讯QQ音乐和Flyme团队合作,率先适配魅族机型的状态栏歌词功能,终于可以边聊天边看歌词,下载QQ音乐最新9。3。5版本,就可以体验新功能。状态栏歌……屏下摄像头加持,外媒三星S10开口会比A8s小IT之家11月25日消息此前IT之家获得的爆料消息显示,三星A8s和S10两款新手机都有望搭载屏下摄像头技术。早先,爆料达人VenyaGeskin1放出了基于传言制作的Infi……房贷利率只有3。9,工资4800元贷款80万,银行仍然能批下在目前的房地产各种花式促销的大形势下,银行对于房贷业务的审查也非常宽松。工资只有4800元,想去银行借款80万去买房,公积金贷款和房屋按揭抵押贷款一定是能批下来的,说不定还有利……人均住户存款是什么?京沪人均住户存款超过20万!人均住户存款是什么?所谓人均住户存款,就是用全市的住户存款除以常住人口;人均住户贷款,就是用全市的住户贷款除以常住人口;人均住户净存款,是用人均住户存款减去人均住户贷款。……RedmiK20Pro将在6月1日上午10点首卖搭载骁龙85IT之家5月31日消息在5月28日下午,小米独立子品牌Redmi正式发布了旗下首款旗舰产品RedmiK20Pro。RedmiK20Pro将在6月1日上午10点开启首卖,售价24……疑似OPPOReno8获全新认证,Reno6沦为牺牲品创历史4月24日,OPPO推出K10系列新品,包括K10和K10Pro两个版本,OPPOK10搭载天玑8000MAX处理器,K10Pro搭载骁龙888移动平台,均正式上市。一经发售,……继透明后盖版小米10后,小米高管晒透明探索版RedmiK30IT之家5月15日消息Redmi此前正式发布RedmiK30Pro,近日小米高级产品营销经理DanielD在推特上晒出了一款透明探索版RedmiK30Pro。IT之家了解……13岁考上985的贵州神童,茅台承诺资助4年学费,为何仅1年生活,处处有惊喜。每天,我们都在为了自己的目标不断的努力着,寻梦的路上,总会有荆棘。从小,老师就告诉我们,做任何事情要持之以恒,不能半途而废。。。。。。生活的路很长……与博世合作奔驰自动泊车系统获批在斯图加特机场落地〔爱卡汽车行业新闻原创〕近日,梅赛德斯奔驰宣布,与博世共同研发的高度自动化泊车系统被德国联邦汽车运输管理局(KBA)批准用于斯图加特机场APCOA运营的P6停车场。双方表……小米印度MIUI活跃用户破8000万,MIUI11明天发布IT之家10月15日消息据小米MIUI印度官方消息,目前MIUI的活跃用户数已破8000万,MIUI11将于明天在印度推出。据悉,CounterpointResearch……防溺水防中暑避雷雨这份暑期孩子安全指南,家长一定记得看夏天是溺水、中暑等安全事故的高发期在享受快乐假期的同时家长们一定要重视孩子的安全防护这份安全指南请您收好1。防溺水安全要点要牢记这些情……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网