2010-07-16 12 views
27

Desidero registrare solo le prime righe di Eccezioni nel mio programma. Lo so, posso fare qualcosa di simile per stampare solo le prime 5 righe di uno stacktrace:Formattazione log4j: è possibile troncare gli stacktraces?

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

Ma preferirei usare log4j (o slf4j sopra log4j per essere più precisi) per la registrazione. C'è un modo per dire a log4j che dovrebbe stampare solo le prime 5 righe di uno stacktrace?

risposta

29

È possibile utilizzare un EnhancedPatternLayout in log4j per formattare gli stacktraces.

Vedere http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html, in particolare la sezione relativa al modello "da buttare" nella tabella dei motivi.

Si noti che il supporto per il supporto %throwable{n} è piuttosto nuovo e richiede almeno log4j 1.2.16 (che è l'ultima al momento della scrittura)

Per gli scopi di monitoraggio, questo è il biglietto che si occupava con la sua attuazione: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902

+0

meraviglioso,% throwable {5} fa proprio quello che mi serve. – rompetroll

+1

Si noti che in caso di eccezioni annidate, questo interromperà misericordiosamente i messaggi nidificati, quindi per molti casi d'uso del mondo reale, questo è inutile. Ciò di cui gli sviluppatori avrebbero bisogno sarebbe limitare il numero di elementi stack per eccezione nella traccia. – tkruse

1

Non so di tale opzione. Ma puoi estendere il tuo attuale appender (ad esempio RollingFileAppender) e fornire un metodo append/doAppend/subAppend (a seconda della classe che stai estendendo) per gestirlo.

Le informazioni Throwable è contenuta in LoggingEvent.throwableInformation

Detto questo, io non sono sicuro che si dovrebbe fare questo - si può perdere informazioni importanti in quel modo.

8

Yup ... EnhancedPatternLayout fornisce questa funzionalità. (Da Log4J-1.2.16, era in compagni extra prima).

Per una configurazione log4j di

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

e per un pezzo di codice Java come

throw new Exception (nuova Exception ("Eccezione interna"));

Si ottiene il seguente nel file di registro ...

java.lang.Exception: java.lang.Exception: Eccezione interna

Se togliamo il '% throwable {} breve' dal nostro file di configurazione log4j che avremmo avuto la traccia stack completo

Problemi correlati