如何在 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 行堆栈跟踪。
我们正在使用 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 行堆栈跟踪。