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

时间:2010-07-16 10:03:59

标签: 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());
}

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

5 个答案:

答案 0 :(得分:33)

您可以在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

答案 1 :(得分:10)

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:1)

我不知道这样的选择。但是您可以扩展当前的appender(例如RollingFileAppender)并提供append / doAppend / subAppend方法(取决于您要扩展的类)来处理此问题。

可投掷信息包含在LoggingEvent.throwableInformation

那就是说,我不确定你应该这样做 - 你可以通过这种方式丢失重要信息。

答案 4 :(得分:1)