首页 > 解决方案 > 如何限制嵌套异常中的堆栈跟踪行数

问题描述

让我们有一个包含多个“由”部分的异常堆栈跟踪:

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。还有别的吗?目标是在有限的环境(一个日志条目的最大字节大小)中从堆栈跟踪中保留尽可能多的有用信息。

标签: javaexceptionloggingstack-trace

解决方案


ThrowableRenderer 将是要走的路。还有来自 openutils-log4j 的 FilteredPatternLayout

严厉的方法是在记录异常链之前获取可抛出的堆栈跟踪,过滤掉帧,并为原因链中的每个可抛出对象重新分配过滤后的堆栈跟踪。这可以应用在自定义日志过滤器类中,但这有点弯曲规则,因为过滤器不应该真正修改可抛出链。这些帧将永远丢失,因此存在风险。

Logback 支持过滤堆栈帧。有关哪些信息值得保留的一些想法,另请参阅从地狱中过滤堆栈跟踪。


推荐阅读