2010-07-16 99 views
27

我想在程序中只記錄例外的前幾行。我知道,我可以做這樣的事情只打印前5行堆棧跟蹤的:Log4j格式化:是否可以截斷堆棧跟蹤?

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它應該只打印stacktrace的前5行?

回答

29

您可以在log4j中使用EnhancedPatternLayout來格式化您的堆棧跟蹤。

參見http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html,具體是關於模式表中「可投擲」模式的部分。

注意,對於%throwable{n}支持支持是相當新的,至少需要log4j的1.2.16(這是最新的在寫作時)

爲了跟蹤的目的,這是與它的實現造成的票: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902

+0

精彩,拋出%{5}不正是我所需要的。 – rompetroll 2010-07-16 10:55:28

+1

請注意,在嵌套異常的情況下,這將無條件地切斷嵌套消息,因此對於許多現實世界的用例而言,這是毫無用處的。開發人員需要的是限制跟蹤中每個異常的堆棧元素數量。 – tkruse 2016-11-07 07:29:06

1

我不知道這樣的選項。但是,您可以擴展當前的appender(例如RollingFileAppender),並提供一個方法(取決於您要擴展哪個類)來處理此問題。

的拋出信息包含在LoggingEvent.throwableInformation

這就是說,我不知道,你應該做到這一點 - 你可以失去重要的信息的方式。

8

是... EnhancedPatternLayout提供了此功能。 (自從Log4J-1.2.16以前,它是在額外的同伴中)。

對於

<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> 

一個log4j的配置和用於片的Java代碼等

擲新的異常(新 的異常( 「內部異常」));

你得到在以下日誌文​​件中...

java.lang.Exception的:java.lang.Exception的:內部異常

如果我們去掉「拋出%從我們的log4j的配置文件{}短」,我們將得到完整的堆棧跟蹤