2008-12-08 8 views
14

Wir verwenden Log4j (und Commons Logging), um unsere Fehlermeldungen zu protokollieren. Nun möchten wir einen zusätzlichen Log-Appender einrichten, der fatale Fehler an syslog ausgibt, aber ohne die außergewöhnlich langen Java-Stacktraces (diese sind immer noch in der vollständigen Log-Datei verfügbar).Wie kann ich log4j so konfigurieren, dass das Exception-Stacktrace nicht gedruckt wird?

Wie würde man das konfigurieren (mit log4j.xml)? Gibt es einen Filter, der die Stack-Traces ignoriert?

+0

Ein weiterer Anwendungsfall, wo man dies wünschen könnte, ist, wenn Sie sind Ausführen einer Reihe von Tests, die negative Tests enthalten, von denen erwartet wird, dass sie Ausnahmen auslösen, von denen wir uns immer bei der Produktion anmelden möchten. Wir wollen nicht, dass unsere Testlogs mit Ausnahmen überfüllt sind, die für den Kurs gleich sind. –

Antwort

14

bearbeiten nach etwas mehr von der Quelle zu lesen:

Sie müssen noch Patternunterklasse, aber die Methode, die Sie außer Kraft setzen möchten, ist ignoresThrowable(): es sollte false zurück, was die appender verhindern das Throwable vom Schreiben (es wird davon ausgegangen, dass das Layout dies bereits getan hat).

Keine Möglichkeit, dies in der Konfiguration anzugeben: PatternLayout hat ein hartcodiertes "return true".

+1

Okay, das funktioniert, danke. Schade, dass dies bei log4j keine Konfigurationsoption ist.Ich frage mich, warum dies so viel anders gehandhabt wird als die anderen Optionen, die PatternLayout zur Verfügung stehen. Scheint wie eine natürliche Formatierung Option für mich ... – Thilo

+1

Es ist ein wenig seltsam: Als ich zuerst sah den Code, ich dachte, dass die Layouts alles behandelt, dann entdeckte, dass es tatsächlich der Appender war. Und dass die Appender etwas anders sind. Wenn Sie das tun, können Sie einen Setter für ignoreThroable() hinzufügen und einen Patch senden. – kdgregory

1

Sie müssen möglicherweise ein benutzerdefiniertes Layout schreiben, um es zu tun (was nicht so schlimm ist; Sie könnten PatternLayout ableiten).

0

Wenn Sie den Quellcode ändern können, ist eine andere Option verfügbar. In meinen Anwendungen protokolliere ich immer nur FATAL-Nachrichten von meinem Eingangspunkt für Anwendungen (z. B. "main()"), da ich nur weiß, dass sie fatal sind, wenn ich die Anwendung wegen ihnen beenden möchte.

Daher instanziieren Sie einen Log4j Logger mit einer speziellen Klasse oder einem MDC von "syslog" oder ähnlichem in diesem einen Bereich (oder einer Handvoll, wenn Sie mehrere Anwendungseinstiegspunkte haben). Wenn Sie einen FATAL-FATAL-Fehler erkannt haben, melden Sie ihn wie gewohnt an (für Ihre anderen Protokolldateien usw.), rufen Sie aber auch die fatal() -Methode für diesen neuen "syslog" -Logger mit der genauen Nachricht auf, die Sie haben wollen (wie nur die Ausnahmeklasse und die Nachricht, aber ohne Stack-Trace). Konfigurieren Sie dann Log4j so, dass nur diese "Syslog" -Klasse oder MDC an einen neu konfigurierten Appender weitergeleitet wird, der auf den SysLog abzielt.

Ta-dum!

2

Das Konvertierungswort "nopex" oder "nopexception" in logback-classic (log4j-Nachfolger) deaktiviert das Drucken von Stack-Traces. Das Konvertierungswort "NOPEX" ist zusammen mit der rest of conversion words dokumentiert. Sie müssen ein wenig nach unten scrollen.

Wenn Sie weitere Informationen zu diesem Thema benötigen, wenden Sie sich bitte an die Logback-Benutzer-Mailingliste.

9

Hier ist der eigentliche Code verwende ich:

import org.apache.log4j.PatternLayout; 

public class NoStackTracePatterLayout extends PatternLayout { 

@Override 
public boolean ignoresThrowable(){ 
    return false; 
} 
} 
+0

Danke. Wieder ist es nicht nett, eine Unterklasse nur dafür zu schreiben. Sollte eine Konfigurationsoption für PatternLayout gewesen sein. – Thilo

4

In 1.2.16 Sie EnhancedPatternLayout

+0

Das war hilfreich für mich. Vielen Dank. –

4

verwenden Wenn Sie log4j verwenden> 1.2.16, können Sie die EnhancedPatternLayout Layout.

Beispiel (mit einer log4j.properties-Datei), definiert es als das Layout Ihrer appender und dann %throwable{0} im Umwandlungsmuster hinzufügen:

log4j.appender.XXX.layout=org.apache.log4j.EnhancedPatternLayout 
log4j.appender.XXX.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c:%L - %m%n%throwable{0} 
+0

Das ist genau was ich brauche, aber mit dem Slf4j Wrapper 'slf4j-log4j12' Version' 1.7.12' (unter der Haube mit 'log4j' Version' 1.2.17') zeigt es immer noch die volle JSONException :(Hat jemand irgendeine Idee warum? –

Verwandte Themen