2013-06-03 14 views
7

Sto scrivendo un CustomLayout per il logback, perché voglio modificare i nomi dei thread e i nomi dei logger. La documentazione di logback diceCome stampare la traccia dello stack dal layout personalizzato di logback?

Nell'esempio precedente, il metodo doLayout ignora eventuali eccezioni contenute nell'evento. In un'implementazione del layout del mondo reale, molto probabilmente vorrai stampare anche il contenuto delle eccezioni.

Umm, sì, certo che voglio stampare tracce dello stack quando l'implementazione predefinita lo farebbe. Ma non riesco a trovare alcuna istruzione per farlo. Ho scaricato le fonti e mi sono guardato intorno. Quanto segue sembra funzionare:

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

Esiste un modo migliore/più approvato?

risposta

5

ThrowableProxyConverter è la soluzione ideale per stampare la traccia dello stack. Quindi, il codice che intendi utilizzare sembra buono. Tuttavia, invece di scrivere un CustomLayout, è possibile adattare PatternLayout con custom converters. Nella stragrande maggioranza dei casi, questa è l'opzione più facile/migliore.

+0

Buon punto: un convertitore personalizzato è molto più pulito. Grazie! – vanmelle

+0

@ceki Si dovrebbe creare, avviare e interrompere un nuovo 'ThrowableProxyConverter' per ogni doLayout? – Ittai

Problemi correlati