2013-06-03 5 views
7

Ich schreibe ein CustomLayout für Logback, weil ich Thread-Namen und Logger-Namen zwicken möchte. Die Logback-Dokumentation lautetWie wird die Stack-Trace vom benutzerdefinierten Logback-Layout gedruckt?

Im obigen Beispiel ignoriert die doLayout-Methode alle eventuellen Ausnahmen, die im Ereignis enthalten sind. In einer realistischen Layout-Implementierung würden Sie höchstwahrscheinlich auch den Inhalt von Ausnahmen drucken wollen.

Umm, ja, natürlich möchte ich Stack-Traces drucken, wenn die Standard-Implementierung würde. Aber ich kann keine Anweisungen dafür finden. Ich lud die Quellen herunter und schaute mich um. Folgendes scheint zu funktionieren:

/** 
* How much stack to print if there's an exception. 
*/ 
private List<String> stackOptionList = Arrays.asList("full"); 

@Override 
public String doLayout(ILoggingEvent event) { 
    StringBuffer sbuf = new StringBuffer(128); 
    . . . 
    IThrowableProxy proxy = event.getThrowableProxy(); 
    if (proxy != null) {  
    ThrowableProxyConverter converter = new ThrowableProxyConverter(); 
    converter.setOptionList(stackOptionList); 
    converter.start(); 
    sbuf.append(converter.convert(event)); 
    sbuf.append(CoreConstants.LINE_SEPARATOR); 
    } 
    . . . 
    return sbuf.toString(); 
} 

Gibt es einen besseren/zugelassenen Weg?

Antwort

5

ThrowableProxyConverter ist der Weg zum Drucken der Stack-Trace. Daher sieht der Code, den Sie verwenden möchten, gut aus. Anstatt jedoch ein CustomLayout zu schreiben, könnten Sie PatternLayout mit custom converters anpassen. In den allermeisten Fällen ist das die leichtere/bessere Option.

+0

Guter Punkt - ein benutzerdefinierter Konverter ist viel sauberer. Vielen Dank! – vanmelle

+0

@ceki Sollte man für jeden doLayout einen neuen ThrowableProxyConverter erstellen, starten und stoppen? – Ittai