我喜欢堆栈痕迹。 不是因为我喜欢错误,而是因为发生错误的那一刻,堆栈跟踪是无价的信息源。 例如,在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

过滤日志中不相关的堆栈跟踪行相关推荐

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

    堆栈跟踪 堆栈跟踪 我喜欢堆栈痕迹. 不是因为我喜欢错误,而是因为发生错误的那一刻,堆栈跟踪是无价的信息源. 例如,在Web应用程序中,堆栈跟踪向您显示完整的请求处理路径,从HTTP套接字到过滤器,S ...

  2. Xdebug中文文档-堆栈跟踪

    文档内容来自xdebug.org/docs,翻译时xdebug版本为2.6.我在官方文档基础上针对中文排版和教程内容的编排做了一些优化,希望中文文档看起来更容易理解. 英文原始文档地址:https:/ ...

  3. .NET/.NET Core中更清晰的堆栈跟踪

    在基于异常的语言中,堆栈跟踪是用于诊断问题最重要的工具之一.在某些情况下,开发人员能得到的仅为一条简短的错误信息以及堆栈跟踪,尤其是当个人可识别信息(PII)约束限制了日志记录的内容时. 随着任务并行 ...

  4. 服务器日志文件中包含堆栈跟踪,日志框架 Logback 官方手册(第三章:Configuration)...

    以下内容翻译整理自logback官方手册,地址:logback官方手册 logback 配置 将日志请求插入应用程序代码需要相当多的计划和工作.观察表明,大约有4%的代码用于日志记录.因此,即使是一个 ...

  5. 如何分析线程转储–线程堆栈跟踪

    本文是" 线程转储"分析系列的第5部分. 到目前为止,您已经了解了线程的基本原理以及它们与Java EE容器和JVM的交互. 您还学习了HotSpot和IBM Java VM的不同 ...

  6. 堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪

    堆栈跟踪 堆栈跟踪 我们最近在博客中发表的一篇评论带回了有关特定体验的一些回忆. 我希望我没有经历过的那种经历. 在创建Plumbr之前很长一段时间,我正在调试一个应用程序,该应用程序每次在蓝月亮时都 ...

  7. oracle获取堆栈,如何从RAISED异常中获取oracle PL / SQL中原始异常的堆栈跟踪?

    我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它. >在proc_a中抛出异常 >抓住例外. >执行回滚. >提出异常. >捕获异常(父块) >打印堆栈跟 ...

  8. linux过滤文件的关键字,linux tail 过滤日志文件中的关键字

    1.查看日志文件中带有指定关键词的日志信息 tail -f  日志文件名 | grep 关键字 | grep 关键字 2.查看日志文件最后1000行 tail -f -n 1000 日志文件  (实时 ...

  9. python logger filter_使用Filter过滤python中的日志输出的实现方法

    事情是这样的,我写了一个tornado的服务,过程当中我用logging记录一些内容,由于一开始并没有仔细观察tornado自已的日志管理,所以我就一般用debug来记录普通日志,error记录有问题 ...

最新文章

  1. 使用Spring MVC统一异常处理实战
  2. xlrd,xlwt模塊
  3. java二维数组高纬低纬_2018-05-17 第十一天
  4. fly a kite
  5. 研讨会 | 知识工程与问答技术研讨会 (KEQA2018)
  6. delphi7 安装delphi 5 delphi 6控件
  7. python猜数字1001untitled_如何利用Matlab GUI制作猜数字游戏
  8. 阿里云 centos7 tomcat 启动巨慢的解决方法(几分钟)
  9. Backtrader(二十三)- 多股票回测
  10. 扩展卡尔曼滤波EKF进行锂电池SOC估计的C语言版本实现,和matlab版本一样包含定参和FFRLS两种情况
  11. 基本面量化与美林时钟模型
  12. CCTV-TIME特别关注:深圳首届弘扬关公文化促进两岸统一忠义论坛
  13. 抖音直播4种套路,让直播间人气快速破1000+
  14. matlab图片在word/wps中模糊解决方法,matlab图片转pdf后信息丢失解决方法
  15. 哈尔滨市政协就推动大数据产业发展建言献策
  16. 从零开始学单片机c语言 pdf,从零开始学习单片机.pdf
  17. 2020年高级工程师职称评审必备条件!
  18. 让年轻人在年轻时做该做的事
  19. 常见GSM模块介绍 ——刊登于《无线电》2008年10期
  20. 专访李华:低调的海云捷迅如何优雅做“减法”

热门文章

  1. ToolProvider.getSystemJavaCompiler() return null 的解决方法
  2. Post请求如何取消异步
  3. 使用工具将SQLServer转MYSQL的方法(连数据)
  4. vaadin_Vaadin提示:延迟加载和商品标识
  5. jdk11 javafx_JDK 11上的JavaFX
  6. kafka streams_Kafka REST Proxy MapR Streams入门
  7. jooq_jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友合作字节码...
  8. hibernate性能_改善Hibernate应用程序性能的7种方法
  9. 将Quarkus应用程序部署到AWS Elastic Beanstalk
  10. Java是发展的垫脚石。 学习吧!