如何在 Java 中仅打印堆栈跟踪中的前几个堆栈

how to print only top few stacks in a stacktrace in Java

我们正在使用 Log4j 和 Slf4j。在应用程序日志中,有时我们需要堆栈跟踪来判断什么是错误的,但整个堆栈跟踪可能非常冗长以至于淹没了日志并损害了性能。我想知道是否有办法执行以下操作:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger LOG = LoggerFactory.getLogger(FOO.class);

catch (Exception e) {
  LOG.error("Error in handling the request", e.getTopStacks(10));
}

我认为这比记录完整的异常要好,因为特别是从 RPC 处理(您知道,RPC 框架中的调用和包装器)抛出的堆栈跟踪可能需要 20-30 行甚至更多。而且它比仅记录 e.getMessage() 更好,因为该应用程序不是由一个人编写的。很难确保所有异常都有有意义的消息。

以及像 guava 或 apache.commons 等流行的通用实用程序库中的现有轮子的建议?提前致谢!

调用 e.getStackTrace(),遍历打印每个元素的结果,当您认为打印足够时停止。

您不应限制代码中堆栈跟踪行的数量:每次格式更改都需要对代码进行数百次修改。记录整个异常:

LOG.error("Error in handling the request", e);

您可以通过向记录器添加 %ex{n}%xEx{n}%rEx{n} 模式来限制记录的堆栈跟踪行数,其中 n 是行(参见 documentation)。例如:

<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%rEx{10}"/>

将打印不超过 10 行堆栈跟踪。