2010-07-16 10 views
27

Ich möchte nur die ersten paar Zeilen von Ausnahmen in meinem Programm protokollieren. Ich weiß, ich etwas tun kann, nur die ersten fünf Zeilen eines Stacktrace drucken:Log4j-Formatierung: Ist es möglich, Stacktraces abzuschneiden?

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

Aber ich würde eher verwenden log4j (oder slf4j über log4j um genauer zu sein) für die Protokollierung. Gibt es eine Möglichkeit, log4j mitzuteilen, dass nur die ersten 5 Zeilen eines Stacktrace gedruckt werden sollen?

Antwort

29

Sie können ein EnhancedPatternLayout in log4j verwenden, um Ihre Stacktraces zu formatieren.

Siehe http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html, speziell der Abschnitt über das "Wurfmuster" in der Mustertabelle.

Beachten Sie, dass für die %throwable{n} Unterstützung unterstützt eher neu und erfordert mindestens log4j 1.2.16 (die die letzte zum Zeitpunkt des Schreibens ist)

Für Tracking-Zwecke, das ist das Ticket, das mit der Umsetzung behandelt: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902

+0

wunderbar% throwable {5} tut genau das, was ich brauche. – rompetroll

+1

Beachten Sie, dass bei verschachtelten Exceptions die verschachtelten Nachrichten gnadenlos abgeschnitten werden, was für viele Anwendungsfälle in der Praxis nutzlos ist. Was Entwickler benötigen würde, wäre die Anzahl der Stack-Elemente pro Ausnahme in der Ablaufverfolgung zu begrenzen. – tkruse

1

Ich kenne keine solche Option. Sie können jedoch Ihren aktuellen Appender (zum Beispiel RollingFileAppender) erweitern und dafür eine Methode bereitstellen (je nachdem, welche Klasse Sie erweitern).

Die throwable Informationen in LoggingEvent.throwableInformation

enthalten ist, das sagte, ich bin nicht sicher, dass Sie sollten dies tun - Sie auf diese Weise wichtige Informationen verlieren.

8

Yup ... EnhancedPatternLayout bietet diese Funktionalität. (Seit Log4J-1.2.16, war zuvor in zusätzlichen Begleitern).

Für eine log4j Konfiguration von

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

und für ein Stück Java-Code wie

throw new Exception (neu Exception ("Inner Exception"));

Sie erhalten die folgenden in der Protokolldatei ...

java.lang.Exception: java.lang.Exception: Interne Ausnahme

Wenn wir die ‚% throwable entfernen {short}‘aus unserer log4j Konfigurationsdatei würden wir den vollständigen Stack-Trace