我们正在使用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?提前感谢!
您不应该限制代码中的堆栈跟踪行数:每次格式更改都需要对代码进行数百次修改。记录整个异常:
LOG.error("Error in handling the request", e);
您可以通过向日志记录器添加%ex{n}
、%xEx{n}
或%rEx{n}
模式来限制记录的堆栈跟踪行数,其中n
是行数(参见文档)。例如:
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%rEx{10}"/>
将打印不超过10行堆栈跟踪信息。
调用e.t getstacktrace(),遍历打印每个元素的结果,当您认为已经打印足够时停止。