table 首先冻结_首先记录异常的根本原因

table 首先冻结

Logback日志库的0.9.30版本带来了一个很棒的新功能:从根(最内部)异常而不是最外部异常开始记录堆栈跟踪。 当然,我的激动与我贡献了此功能无关。

用塞西尔·德·米勒(Cecil B. de Mille) 的话来形容:“撰写博客文章的方法是从堆栈跟踪开始,直至达到高潮 ” –在这里:

详细信息还不重要,但是从100ft视图中,您可以看到较长的堆栈跟踪,并且有多个相互包裹的异常( 引起 )。 我们将回到此堆栈跟踪,但首先要了解一些基础知识。 如果抛出异常,则会以某种方式记录日志,以显示异常发生时瞬间堆栈的外观。 在最底部,您将看到静态的main()Thread.run() ,该方法通过调用直到第一个堆栈跟踪行的方法进行处理,该行指示实际抛出异常的位置。 这非常方便,因为您可以看到导致异常的整个控制流程:

public class BookController {private final BookService bookService = new BookService();public void alpha() { beta(); }private void beta() { gamma(); }private void gamma() { bookService.delta(); }public static void main(String[] args) {new BookController().alpha();}
}class BookService {private final BookDao bookDao = new BookDao();public void delta() { epsilon(); }private void epsilon() { zeta(); }private void zeta() { bookDao.eta(); }
}class BookDao {public void eta() { theta(); }private void theta() { iota(); }public void iota() { throw new RuntimeException("Omega server not available"); }
}

如果您不知道希腊字母 ,则可以从堆栈跟踪中开始学习(请记住,控制流从底部开始并一直向上):

java.lang.RuntimeException: Omega server not availableat BookDao.iota(BookController.java:50)at BookDao.theta(BookController.java:48)at BookDao.eta(BookController.java:46)at BookService.zeta(BookController.java:41)at BookService.epsilon(BookController.java:39)at BookService.delta(BookController.java:37)at BookController.gamma(BookController.java:22)at BookController.beta(BookController.java:20)at BookController.alpha(BookController.java:18)at BookController.main(BookController.java:26)

太好了吧? 从上到下阅读时,您可以说: iota()由theta()调用,而eta()则调用…清晰而简单。 但是,如果有人决定包装原始异常并重新抛出该异常怎么办?

public class BookController {private static final Logger log = LoggerFactory.getLogger(BookController.class);private final BookService bookService = new BookService();public void alpha() { beta(); }private void beta() { gamma(); }private void gamma() {try {bookService.delta();} catch (Exception e) {throw new RuntimeException("Sorry, try again later", e);}}public static void main(String[] args) {try {new BookController().alpha();} catch (Exception e) {log.error("", e);}}
}class BookService {private final BookDao bookDao = new BookDao();public void delta() { epsilon(); }private void epsilon() { zeta(); }private void zeta() {try {bookDao.eta();} catch (Exception e) {throw new RuntimeException("Unable to save order", e);}}
}class BookDao {public void eta() { theta(); }private void theta() { iota(); }public void iota() {try {throw new RuntimeException("Omega server not available");} catch (Exception e) {throw new RuntimeException("Database problem", e);}}
}

现在快速:在堆栈跟踪中找到根本原因!

java.lang.RuntimeException: Sorry, try again laterat BookController.gamma(BookController.java:26)at BookController.beta(BookController.java:20)at BookController.alpha(BookController.java:18)at BookController.main(BookController.java:32)
Caused by: java.lang.RuntimeException: Unable to save orderat BookService.zeta(BookController.java:51)at BookService.epsilon(BookController.java:45)at BookService.delta(BookController.java:43)at BookController.gamma(BookController.java:24)... 8 common frames omitted
Caused by: java.lang.RuntimeException: Database problemat BookDao.iota(BookController.java:66)at BookDao.theta(BookController.java:60)at BookDao.eta(BookController.java:58)at BookService.zeta(BookController.java:49)... 11 common frames omitted
Caused by: java.lang.RuntimeException: Omega server not availableat BookDao.iota(BookController.java:64)... 14 common frames omitted

原来main()不再是最后一行。 更糟糕的是,一切似乎都出现了乱码,请尝试再次阅读希腊字母…现在让我们回到原始的堆栈跟踪中。 它来自Spring框架启动失败,想象它可能长达几页。

为了方便起见,我添加了箭头来标记您重建控制流所应遵循的路径:从红色箭头的尾部( Thread.run() )开始,在中间的某个位置向上,然后…跳至橙色箭头的尾部。 从橙色箭头的头部跳到绿色箭头的尾巴,依此类推...不是很直观,您不觉得吗? 这个红色的椭圆显示了什么? 是的,这是失败的根本原因(最内部的异常)。 另一方面,在最开始打印的异常(通常是您一开始就读到的异常 )说明了创建DefaultAnnotationHandlerMapping#0时发生的错误 (是什么?)真正的错误( 没有匹配的bean类型…… )被巧妙地隐藏了……

那么这个新功能到底是什么呢? 还是我们的简单例子。 升级到0.9.30之后,只需在日志记录模式的末尾添加%rEx (或等效的%rootException ):

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{ISO8601} | %-5level | %thread | %logger{1} | %m%n%rEx</pattern></encoder>
</appender>

这将替换为我亲自贡献的默认堆栈跟踪打印路由。 现在将打印相同的希腊程序:

java.lang.RuntimeException: Omega server not availableat BookDao.iota(BookController.java:64)
Wrapped by: java.lang.RuntimeException: Database problemat BookDao.iota(BookController.java:66)at BookDao.theta(BookController.java:60)at BookDao.eta(BookController.java:58)at BookService.zeta(BookController.java:49)
Wrapped by: java.lang.RuntimeException: Unable to save orderat BookService.zeta(BookController.java:51)at BookService.epsilon(BookController.java:45)at BookService.delta(BookController.java:43)at BookController.gamma(BookController.java:24)
Wrapped by: java.lang.RuntimeException: Sorry, try again laterat BookController.gamma(BookController.java:26)at BookController.beta(BookController.java:20)at BookController.alpha(BookController.java:18)at BookController.main(BookController.java:32)

请仔细将其与先前的输出进行比较。 首先,第一行指出了问题所在。 在大多数情况下,您都无需跳过“ 由...引起的 ”例外,您可能会跳过其余部分。 其次,控制流是不间断且连续的–您仍然可以从上至下阅读,反之亦然。 最后但并非最不重要的一点是–同时保留了异常被包裹的事实,但不会使堆栈跟踪混乱。

现在您应该看到利用%rEx打印的原始Spring异常:

观察结果完全相同:问题的根本原因从一开始就出现,从而缩短了需要研究问题的时间。 同样,在分析控制流时,不会跳跃-Thread.main()位于底部,您可以连续读取底部到顶部的轨迹。

如果您使用堆栈跟踪(在开发中或在生产/支持中)进行大量工作–请考虑切换到根本原因优先日志记录。 每次您分析特定异常时,它将节省您几秒钟的时间。 但是我还注意到,经验不足的开发人员有时甚至不知道“ 由...引起的 ”规则: 找到第一个例外,然后查看最后一个由...引起的 ” –根本不知道问题是什么,只查看最外面,最不具体,最通用的错误。 这也将对他们有帮助。

顺便说一下,如果您避免完全包装和重新抛出异常,则可以避免所有这些麻烦。 我知道,我们经常会因检查异常而被迫这么做……

参考: 日志异常的根源首先来自我们的JCG合作伙伴Tomek Nurkiewicz,位于NoBlogDefFound

编码愉快! 不要忘记分享!

相关文章:

  • Java日志混乱
  • 正确记录应用程序的10个技巧
  • 使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍
  • Java最佳实践系列
  • 每个程序员都应该知道的事情
  • 生存在荒野西部开发过程中的9条提示
  • 软件设计法则

翻译自: https://www.javacodegeeks.com/2011/09/logging-exceptions-root-cause-first.html

table 首先冻结

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

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

相关文章

Spring Boot框架敏感信息泄露的完整介绍与SRC实战(附专属字典与PoC)

转载于&#xff1a;https://www.freebuf.com/vuls/289710.html #前言##Spring Boot框架介绍Spring框架功能很强大&#xff0c;但是就算是一个很简单的项目&#xff0c;我们也要配置很多东西。因此就有了Spring Boot框架&#xff0c;它的作用很简单&#xff0c;就是帮我们自动配…

从外网Thinkphp3日志泄露到杀入内网域控 - 红队攻击之域内靶机渗透实战演练

1.简要描述 这个工具写完有一段时间了&#xff0c;看网上目前还没有一个thinkphp的漏洞集成检测工具&#xff0c;所以打算开源出来。 2.代码结构 插件化思想&#xff0c;所有的检测插件都plugins目录里&#xff0c;TPscan.py主文件负责集中调度。 插件目录: ThinkPHP 用户…

使用WildFly 9和Jolokia监视DevOps样式

DevOps是当今最热门的话题之一。 而且围绕它的主题范围很广&#xff0c;因此很难真正找到完整的描述或涵盖体面粒度的所有内容。 可以肯定的一件事&#xff1a;最重要的部分之一是提供正确的度量标准和信息以监视应用程序。 Java EE和JMX 监视Java EE服务器的标准方法是JMX。 …

QQ聊天记录恢复、迁移教程(改变默认存储位置、个人文件夹保存位置)

方法一&#xff1a;适用于将原QQ聊天记录存储位置迁移至非系统盘 1、 在想要存储的区域新建文件夹&#xff0c;如&#xff1a; E:\099 Chat Data\Tencent Files\。 2、 打开电脑QQ&#xff0c;设置——文件管理。 3、 点击浏览&#xff0c;选择099 Chat Data下的Tencent Files…

html type=text/css,type=text/css 有什么用啊 ?

用处是告诉浏览器&#xff0c;这段标签内包含的内容是css或text&#xff0c;也就是说如果某种浏览器(特别是wap等手机浏览器械、)不能识别css的&#xff0c;会将代码认为text&#xff0c;从而不显示也不报错。type->类型,这里是style的属性text/css ->文本/css,即css文本…

记一次应急响应到溯源入侵者

文本转载于&#xff1a;https://www.freebuf.com/articles/web/289450.html 1. 前言今年的某月某日&#xff0c;系统监测到客户的一企业官网www.******.com遭到了网页篡改&#xff0c;经过人工确认将浏览器的UA替换为百度UA后访问网站&#xff0c;此时网站链接自动跳转至赌博类…

系统测试集成测试单元测试_单元和集成测试的代码覆盖率

系统测试集成测试单元测试我最近在一个宠物项目中着手构建自动化的UI&#xff08;集成&#xff09;测试以及普通的单元测试。 我想将所有这些集成到我的Maven构建中&#xff0c;并提供代码覆盖率报告&#xff0c;以便我可以了解测试覆盖率不足的区域。 我不仅发布了项目的源代码…

计算机盘符无法重命名,win8磁盘分区无法重命名怎么办

有些用户在使用Win8系统的过程中遇到C盘分区重命名的时候发生“无法修改名称”,那么win8磁盘分区无法重命名怎么办呢?下文学习啦小编就分享了解决win8磁盘分区无法重命名的方法&#xff0c;希望对大家有所帮助。win8磁盘分区无法重命名解决方法1、 按“WinR”输入“regedit”单…

记一次CNVD通用漏洞审计

本文转载于&#xff1a;https://www.freebuf.com/articles/web/290697.html 0x01 前言写这篇文章的缘由其实还挺魔幻的&#xff0c;起因是在一次实战渗透时通过弱口令拿下一个低权限用户成功进入后台&#xff0c;在后台寻找功能点通过抓包分析&#xff0c;定位到目标系统后台存…

计算机管理里边如何分盘,如何给电脑分盘【设置门径】

很多小伙伴都遇到过如何给电脑分盘的困惑吧&#xff0c;一些朋友看过网上零散的如何给电脑分盘的处理方法&#xff0c;并没有完完全全明白如何给电脑分盘是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xff0c;只需要按照1&#xff1a;首先我们找到电脑里面的此电脑…

电脑常识——host文件修改(屏蔽网站或解开屏蔽)

1. 什么是host文件&#xff1a; Hosts文件主要作用是定义IP地址和主机名的映射关系&#xff0c;是一个映射IP地址和主机名的规定。可以用文本文件打开&#xff01;当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从Hosts文件中寻找对应的IP地址&#xff…

glassfish_具有GlassFish和一致性的高性能JPA –第3部分

glassfish在我的四部分系列的第三部分中&#xff0c;我将说明将Coherence与EclipseLink和GlassFish结合使用的第二种策略。 这就是通过EclipseLink使用Coherence作为二级缓存&#xff08;L2&#xff09;的全部内容。 一般的做法 这种方法将Coherence数据网格应用于依赖于数据库…

应广大粉丝的要求,推荐几本前端书籍

这些书籍平时会直接发送在主页的QQ技术群,有兴趣的可以加一下。 不想去培训机构,不想花大笔钱的学习,那就自学吧!接招

java的数据结构

本文转自互联网 1、二叉树&#xff1a;非线性数据结构&#xff0c;常被用于实现二叉查找树和二叉堆 二叉树的第i层至多有2的 i -1次方个结点&#xff1b;深度为k的二叉树至多有2^(k) -1个结点&#xff1b;对任何一棵二叉树T。 满二叉树 完全二叉树 平衡二叉树 2、 二叉树的遍历…

AssertJ的SoftAssertions –我们需要它们吗?

编写好的单元测试的规则之一是&#xff0c;它应该出于某种原因而失败&#xff0c;因此&#xff0c;单元测试应该测试一种逻辑概念。 有时很难在每个测试中拥有一个断言。 为了遵循规则&#xff0c;我们可能在一个测试中每个对象具有多个断言。 但是&#xff0c;在单个测试中存…

早上起来CSDN的PC端主页积分变成了0

没有违法&#xff0c;没有乱纪&#xff0c;这是什么鬼&#xff1f;我刚才百度了一下&#xff0c;很多大牛都有类似的经历&#xff0c;心里舒服多了 平台BUG还是挺多的&#xff0c;说不准哪天就轮到你啦&#xff0c;哈哈&#xff01;&#xff01;

Fofa搜索技巧

Fofa搜索技巧&#xff08;理论加实践的整理&#xff09; 题记 最近在整理以前的知识&#xff0c;不过最近出现职业病了&#xff0c;打开fofa看站点就停不下来。我把常用的fofa查询语句记录下来&#xff0c;方便查阅。钟馗之眼和他有区别也异曲同工。 https://fofa.so/ http://…

魔兽世界阿拉索人数最多服务器,魔兽世界8.3哪个区人多_wow8.3服务器人数统计介绍_3DM网游...

魔兽世界8.3人口最多大区是很多玩家都非常关心的一件事情&#xff0c;很多玩家都想在这个新版本去最多的服务器&#xff0c;很多玩家都想知道服务器人口&#xff0c;来看看魔兽世界8.3哪个区人多&#xff0c;wow8.3服务器人数统计介绍。8.3人口最多大区介绍魔兽世界8.3安苏大区…

如何系统的学习javaScript?赶紧看看吧

当今如果要开发现代网站或web应用(包括互联网创业),都要学会JavaScript。而面对泛滥的JavaScript在线学习资源,却是很难找到一份高效而实用的方法去学习这个“web时代的语言”。有一点需要注意,几年前我们需要知道一个真正的服务器端语言(比如PHP,Rails,Java,Python 或…

Shiro-550反序列化漏洞复现

0x01 漏洞简介Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中&#xff0c;加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可…