java - 如何限制嵌套异常中的堆栈跟踪行数
问题描述
让我们有一个包含多个“由”部分的异常堆栈跟踪:
my.Exception1: Bad luck
at ...
Caused by: my.Exception2
at ...
Caused by: my.Exception3
at ...
Caused by: my.Exception4
at ...
每个由部分引起的都可以跨越多行。有一个JVM参数
-XX:MaxJavaStackTraceDepth
但这会影响整个堆栈跟踪 - 它会剪切下面的所有内容,例如 Exception3(最里面的 Exception 将被淘汰)。我想保留每个“由”部分,但将每个部分限制为例如 20 行。我知道的一种可能的解决方案是来自 log4j 的 ThrowableRenderer。还有别的吗?目标是在有限的环境(一个日志条目的最大字节大小)中从堆栈跟踪中保留尽可能多的有用信息。
解决方案
ThrowableRenderer 将是要走的路。还有来自 openutils-log4j 的 FilteredPatternLayout。
严厉的方法是在记录异常链之前获取可抛出的堆栈跟踪,过滤掉帧,并为原因链中的每个可抛出对象重新分配过滤后的堆栈跟踪。这可以应用在自定义日志过滤器类中,但这有点弯曲规则,因为过滤器不应该真正修改可抛出链。这些帧将永远丢失,因此存在风险。
Logback 支持过滤堆栈帧。有关哪些信息值得保留的一些想法,另请参阅从地狱中过滤堆栈跟踪。
推荐阅读
- c# - 如何从类占位符文本框中获取文本
- splunk - Splunk 生成随机事件
- bash - 如何让 Grunt CLI 只返回退出代码?
- angular - 如果通过键入 url 或刷新导航到命名/子路由器出口,则抛出 404
- latex - 为什么我的缩写不显示在 PDF 中?
- reactjs - React - eslint 给出 null 错误的值
- opengl - SDL_opengl 做什么?
- google-apps-script - UrlFetchApp.fetchAll “异常:ScriptError 异常:地址不可用”错误随机引发
- apache-spark - 双重重新分区时的火花洗牌
- access-control - Laravel8 基于角色的访问使用和数据透视表和中间件