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

rom*_*oll 30 java logging log4j stack-trace

我想在我的程序中只记录Exceptions的前几行.我知道,我可以做这样的事情只打印堆栈跟踪的前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());
}
Run Code Online (Sandbox Code Playgroud)

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

Hen*_*rik 35

您可以在log4j中使用EnhancedPatternLayout来格式化堆栈跟踪.

请参阅http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html,特别是有关模式表中"throwable"模式的部分.

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

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

  • 请注意,在嵌套异常的情况下,这将无情地切断嵌套消息,因此对于许多现实世界的用例,这是无用的.开发人员需要的是限制跟踪中每个异常的堆栈元素数量. (3认同)

小智 10

是的... EnhancedPatternLayout提供此功能.(自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>
Run Code Online (Sandbox Code Playgroud)

并为一段Java代码

抛出新的异常(new Exception("Inner Exception"));

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

java.lang.Exception:java.lang.Exception:内部异常

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


vsi*_*ngh 5

在 log4j2.xml 中,只需在末尾添加 %throwable{short} 即可。无需添加参数名称。

<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n %throwable{short} %n"/>
Run Code Online (Sandbox Code Playgroud)

参考: https: //logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout