Formattazione di Log4j: è ansible troncare gli stacktraces?

Voglio registrare solo le prime righe di eccezioni nel mio programma. Lo so, posso fare qualcosa del genere per stampare solo le prime 5 righe di uno stacktrace:

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 preferisco usare log4j (o slf4j su 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?

È ansible utilizzare un EnhancedPatternLayout in log4j per formattare i propri stacktraces.

Vedi 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 pattern.

Nota che il supporto per il supporto %throwable{n} è piuttosto nuovo e richiede almeno log4j 1.2.16 (che è l’ultimo al momento della scrittura)

A scopo di monitoraggio, questo è il ticket che ha affrontato la sua implementazione: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902

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

Per una configurazione di log4j di

       

e per un pezzo di codice Java come

lanciare una nuova eccezione (nuova eccezione (“Eccezione interna”));

Ottieni il seguente nel file di registro …

java.lang.Exception: java.lang.Exception: Inner Exception

Se togliamo ‘% throwable {short}’ dal nostro file di configurazione log4j otterremmo la traccia dello stack completo

In log4j2.xml aggiungi semplicemente% throwable {short} alla fine. Non c’è bisogno di aggiungere il nome del parametro.

  

ref: https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

Non conosco un’opzione del genere. Ma puoi estendere il tuo attuale appender (ad esempio RollingFileAppender ) e fornire un metodo append / doAppend / subAppend (a seconda della class che stai estendendo) per gestirlo.

Le informazioni gettabili sono contenute in LoggingEvent.throwableInformation

Detto questo, non sono sicuro che dovresti farlo – puoi perdere informazioni importanti in questo modo.

Sì, fa parte di log4j da log4j 1.2.16

Ecco la proposta originale nel tracker dei problemi di Apache che descrive in dettaglio come appare ciascuna delle applicazioni del modello% throwable: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902#c0