堆栈跟踪 堆栈跟踪_过滤日志中无关的堆栈跟踪行

堆栈跟踪 堆栈跟踪

我喜欢堆栈痕迹。 不是因为我喜欢错误,而是因为发生错误的那一刻,堆栈跟踪是无价的信息源。 例如,在Web应用程序中,堆栈跟踪向您显示完整的请求处理路径,从HTTP套接字到过滤器,Servlet,控制器,服务,DAO等,直至发生错误的地方。 您可以将它们读为一本好书,其中每个事件都有因果关系。 我什至在Logback打印异常的方式上实现了一些增强,请参阅首先记录异常的根本原因 。

但是有一件事一直困扰着我一段时间。 臭名昭著的“ 来自地狱的堆栈跟踪 ”症状–堆栈跟踪包含数百种不相关的,隐秘的,通常是自动生成的方法。 AOP框架和过度设计的库往往会产生疯狂的长执行跟踪。 让我展示一个真实的例子。 在一个示例应用程序中,我正在使用以下技术堆栈:

颜色很重要。 根据框架/层的颜色,我绘制了一个示例堆栈跟踪,该堆栈跟踪是由于尝试从数据库中获取数据时引发的异常抛出而引起的:

不再那么愉快,你不觉得吗? 在第一张图中,将Spring放在应用程序和Hibernate之间是一个极大的简化。 Spring框架是一个胶合代码,用于连接并拦截周围层的业务逻辑。 这就是为什么应用程序代码被数十行技术调用分散和交织的原因(请参见绿线)。 我在应用程序中投入了尽可能多的内容(Spring AOP,方法级别的@Secured批注,自定义方面和拦截器等)来强调这个问题-但这不是特定于Spring的。 EJB服务器在EJB调用之间生成同样可怕的堆栈跟踪(…从地狱)。 我应该在乎吗? 想想看,当您从BookController.listBooks()无辜地调用BookService.listBooks() ,您希望看到此消息吗?

at com.blogspot.nurkiewicz.BookService.listBooks()
at com.blogspot.nurkiewicz.BookService$$FastClassByCGLIB$$e7645040.invoke()
at net.sf.cglib.proxy.MethodProxy.invoke()
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint()
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed()
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed()
at com.blogspot.nurkiewicz.LoggingAspect.logging()
at sun.reflect.NativeMethodAccessorImpl.invoke0()
at sun.reflect.NativeMethodAccessorImpl.invoke()
at sun.reflect.DelegatingMethodAccessorImpl.invoke()
at java.lang.reflect.Method.invoke()
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs()
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod()
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke()
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed()
at org.springframework.aop.interceptor.AbstractTraceInterceptor.invoke()
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed()
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke()
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed()
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke()
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed()
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept()
at com.blogspot.nurkiewicz.BookService$$EnhancerByCGLIB$$7cb147e4.listBooks()
at com.blogspot.nurkiewicz.web.BookController.listBooks()

您甚至注意到它们之间存在自定义方面吗? 事实就是如此,如今在堆栈跟踪中杂乱无章,几乎不可能遵循实际的业务逻辑。 我们拥有的最好的故障排除工具之一是在99%的情况下都不需要与框架相关的无关内容。

工具和IDE在减少噪声方面做得很好。 Eclipse具有用于Junit的堆栈跟踪过滤器模式 , IntelliJ IDEA支持控制台折叠自定义 。 另请参阅: 从Java堆栈跟踪中清除噪音 ,这启发了我写这篇文章。 那么,为什么从根本上不在Logback这样的日志记录框架中拥有这种可能性呢?

我在Logback中实现了一个非常简单的增强。 基本上,您可以定义一组应该从堆栈跟踪中排除的堆栈跟踪框架模式。 通常,您将使用不希望看到的包或类名。 这是启用了新功能的示例logback.xml摘录:

<root level="ALL"><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} | %-5level | %thread | %logger{1} | %m%n%rEx{full,java.lang.reflect.Method,org.apache.catalina,org.springframework.aop,org.springframework.security,org.springframework.transaction,org.springframework.web,sun.reflect,net.sf.cglib,ByCGLIB}</pattern></encoder></appender>
</root>

在过滤几乎整个Spring框架+ Java反射和CGLIB类时,我有点极端。 但这只是给您一种印象,您可以得到多少。 将我的增强功能应用到Logback后,会出现同样的错误:

提醒一下,绿色是我们的应用程序。 最终在一个地方,最终您可以真正看到发生错误时代码在做什么:

at com.blogspot.nurkiewicz.DefaultBookHelper.findBooks()
at com.blogspot.nurkiewicz.BookService.listBooks()
at com.blogspot.nurkiewicz.LoggingAspect.logging()
at com.blogspot.nurkiewicz.web.BookController.listBooks()

更简单? 如果您喜欢此功能,我打开了一张票LBCLASSIC-325 : 筛选出选定的堆栈跟踪框架 。 投票讨论。 这只是一个概念证明,但是如果您想看一下实现(欢迎改进!),可以在我的Logback 分支下找到(大约20行代码)。

参考:从我们的JCG合作伙伴的 日志中过滤无关的堆栈跟踪行   Java和社区博客中的Tomasz Nurkiewicz。


翻译自: https://www.javacodegeeks.com/2012/03/filter-irrelevant-stack-trace-lines-in.html

堆栈跟踪 堆栈跟踪

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

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

相关文章

VUE使用vue-seamless-scroll自动滚动表格数据,对表格数据排序无效的解决办法

使用vue-seamless-scroll循环表格数据&#xff0c;建议使用v-for,ul li 的形式便于操作属性&#xff0c;elemengt ui table可能不好处理兼容性问题及属性设置&#xff0c;尤其是一个页面添加多个表格及效果。 VUE : 排序 this.$refs.seamlessScroll.reset() 效果图

前端常见的加密算法介绍

一、前言 在信息安全越来越受重视的今天&#xff0c;前端的各种加密也变得更加重要。通常跟服务器的交互中&#xff0c;为保障数据传输的安全性&#xff0c;避免被人抓包篡改数据&#xff0c;除了 https 的应用&#xff0c;还需要对传输数据进行加解密。 目前常见的加密算法可…

一时冲动:“通往瓦尔哈拉之路的冒险”

通过所有有关Java 9和Project Jigsaw的讨论&#xff0c;我们不应忽视Java的另一重大变化。 希望在第10版或第11版中&#xff0c; Valhalla项目能够实现并介绍价值类型和专业化。 那么这是怎么回事&#xff0c;项目进展如何&#xff0c;面临什么挑战&#xff1f; 几天前&#x…

小程序分包

一、小程序分包 微信文档写的够清楚了 使用分包 | 微信开放文档 &#xff08;1&#xff09;常规分包注意点&#xff1a; 每个分包只能引用主包和自己的资源 &#xff08;2) 独立分包注意点&#xff1a;特别麻烦 懒得用了吧 独立分包中不能依赖主包和其他分包中的内容 …

解决Sublime Text3莫名的中文乱码问题

有好几回用Sublime Text3写着中英混杂的文字的时候&#xff0c;会突然就弹出警告说什么编码不行&#xff0c;然后点击确定后&#xff0c;原来的中文全都乱码了&#xff1a; 然后即使按ctrlz撤回也没用&#xff0c;重新打开也没用&#xff0c;用记事本的转换ansi、unicode等方式…

try catch finally的用法

1、不使用try...catch出现异常后&#xff0c;后面的代码都不会运行了 login() {console.log(b);console.log(hhhhhhhh);}, 2、使用了try...catch出现异常后&#xff0c;try...catch后的代码还会继续运行 login() {try{console.log(b);}catch (e){console.log(e);}console.log…

网站优化第一次网页加载的速度的办法与思路。

网站重新开发了一次&#xff0c;第一次部署到测试网络&#xff0c;访问速度很慢&#xff0c;差不多第一次加载得需要40秒&#xff0c;太慢了&#xff0c;这里简单总结一下。 当然&#xff0c;还有一些无用的.MAP文件都可以删除&#xff0c;图片可以在线压缩一下&#xff0c;代码…

我的Serverless实战——大前端趋势之Serverless从入门到天黑

导读&#xff1a;大厂都在做Serverless&#xff0c;他到底是什么东东呢&#xff1f;可能很多人都没有听说过&#xff0c;听说这个是大前端的一个趋势&#xff0c;最近两年比较火&#xff0c;如果你还没有听说过&#xff0c;那你就需要注意啦。今天孙叫兽带大家了解一下Serverle…

element ui upload上传文件成功后,清除默认的列表。

问题描述&#xff1a;每次提交之后&#xff0c;这个上传按钮会有默认的列表&#xff0c;其实刷新这个默认列表就没了。 清除标记位置的办法&#xff1a; 清除列表&#xff1a;&#xff08;上传成功后&#xff0c;清空列表&#xff09; 效果图&#xff1a;

处理网络请求qs、图片转base64的优劣

一、引入qs这个库&#xff0c;更好的处理网络请求传参。 qs.parse let url http://item.taobao.com/item.htm?a1&b2&c&dxxx&e; let data qs.parse(url.split(?)[1]);// data的结果是 {a: 1, b: 2, c: , d: xxx, e: }qs.stringify 二、图片文件转为base6…

花了一天的时间给粉丝做了一个小米官网(高仿)

身为前端程序员&#xff0c;经常会找几个官网试试手&#xff0c;哈哈&#xff0c;这次拿小米官网试试手吧。 目录 效果图&#xff1a; 项目结构 index.html index.css js 下载地址&#xff1a;点我下载 效果图&#xff1a; 项目结构 index.html <!DOCTYPE html> &l…

uniapp踩坑指南之坑多到写不完

1、sticky:到达指定位置时&#xff0c;就停留在那里不动了。当发现可以走时&#xff0c;立马就走了。 如果走不了就不会动了&#xff0c;就会一直在那里。 https://www.cnblogs.com/byeyear/p/11999334.html 设置了sticky定位的元素相对于第一个定位不为static的父级元素的位置…

小程序引入百度地图与uni.getLocation的使用

一、小程序引入百度地图 1、当你不需要引入整个地图展示&#xff0c;只需要引入某些功能的时候&#xff0c;可以直接调用服务端api。 2、访问百度地图的任何api都需要密钥。 流程&#xff1a; 3、在小程序端配置请求合法域名&#xff1a;https://api.map.baidu.com 4、直接使…

当年上大学时,编程老师让我们用html+CSS实现一个天猫官网

纯用htmlcss实现一个天猫首页还是挺考验基本功的&#xff0c;完全考验自己的CSS功底。 目录 效果图 项目结构 index.html 源码下载&#xff1a;点我下载 效果图 项目结构 主要由htmlcss组成。 index.html <!doctype html> <html lang"en"><head&g…

微服务实战系列之Dubbo(上)

前言 随着一年一度冬至的到来&#xff0c;2023的步伐也将远去。而博主的系列文章&#xff0c;也将从今天起&#xff0c;越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面&#xff0c;无论使用什么框架、组件或工具&#xff0c;皆可拿来用之。 那么…

多线程图解

关于多线程一直是我们学习iOS的一个重点&#xff0c;不仅是面试中经常被问到的问题&#xff0c;而且我们开发过程过程中经常会用到的技术&#xff0c;下面是一张关于多线程的图解&#xff0c;希望可以帮助大家学习多线程的开发。 转载于:https://www.cnblogs.com/lyy-5518/p/53…

spring作业_Spring和石英:多作业计划服务

spring作业作业调度对于应用程序来说是如此重要。 尤其是在大型项目中&#xff0c;处理大量工作可能是一个问题。 Spring和Quartz为解决该问题带来了巨大的好处。 本文展示了如何通过使用Spring和Quartz轻松地计划多个作业。 二手技术&#xff1a; JDK 1.6.0_21 春天3.1.1 石…

react常用知识点总结

1、什么是jsx JSX是JavaScript的扩展语法,这种<></>标签的写法就是 JSX。JSX 编写的组件通过预处理器 babel 解析后,再交给 React 库渲染到指定父容器下,形成最终html页面,供浏览器解析和显示。 JSX会被babel编译为&#xff1a;React.createElement()&#xff0c…

前端导入导出文件

一、导出 1、返回值是url&#xff1a;创建个a标签即可 printRecord(params).then((response) > {if (response.success) {let a document.createElement(a);//创建a标签//从新页面打开&#xff0c;下载的话不需要这个&#xff0c;打开一个图片需要从新页面打开a.setAttrib…

vue进阶

1、vue-cli 使用 在开发中&#xff0c;需要打包的东西不止是js、css、html。还有更多的东西要处理&#xff0c;这些插件和加载器如果我们一一去添加就会比较麻烦&#xff0c;vue官方提供了一个快速搭建vue项目的脚手架&#xff0c;使用它能快速的构建一个web工程模板。 官网&…