我想在我的程序中只记录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行?
答案 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)