Log4j 格式化:是否可以截断堆栈跟踪?

2022-09-01 05:17:58

我只想在我的程序中记录异常的前几行。我知道,我可以做这样的事情来只打印堆栈跟踪的前5行:

Throwable e = ...;
StackTraceElement[] stack = e.getStackTrace();
int maxLines = (stack.length > 4) ? 5 : stack.length;
for (int n = 0; n < maxLines; n++) {
    System.err.println(stack[n].toString());
}

但我宁愿使用log4j(或slf4j而不是log4j更精确)进行日志记录。有没有办法告诉log4j它应该只打印堆栈跟踪的前5行?


答案 1

您可以使用 log4j 中的增强型模式来格式化堆栈跟踪。

请参阅 http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html,特别是有关模式表中“可抛出”模式的部分。

请注意,对支持的支持是相当新的,至少需要log4j 1.2.16(这是撰写本文时的最新版本)%throwable{n}

出于跟踪目的,这是处理其实现的票证:https://issues.apache.org/bugzilla/show_bug.cgi?id=48902


答案 2

是的。。。增强的模式布局提供了此功能。(由于Log4J-1.2.16,之前是额外的同伴)。

对于 log4j 配置

<appender name="Console" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="debug"/>
    <layout class="org.apache.log4j.EnhancedPatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%t] %c.%M - %m%n %throwable{short}"/>
    </layout>
</appender>

对于一段 Java 代码,例如

抛出新的异常(新的异常(“内部异常”));

您将在日志文件中得到以下内容...

java.lang.Exception: java.lang.Exception: Inner Exception

如果我们从log4j配置文件中删除'%throwable{short}',我们将得到完整的堆栈跟踪


推荐