2010-08-11 1 views
5

quando si scriveÈ possibile prefissare ogni riga di uno stacktrace in log4j?

logger.error("message", exception); 

log4j genera il messaggio e la completa analisi dello stack:

Aug 9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception 
at fatherOfException 
at fatherof_fatherOfException 
at fatherof_fatherof_fatherOfException 
... 

il mio modello di conversione è

log4j.appender.syslog.layout.ConversionPattern=myPrefix: [%p] [%t] [%c] [%x] - %m%n 

Quindi, è possibile prefisso ogni linea con myPrefix, come:

Aug 9 06:26:13 10.175.60.14 myPrefix: [error] [TP-Processor114] [my.class.Name] message : exception 
myPrefix at fatherOfException 
myPrefix at fatherof_fatherOfException 
myPrefix at fatherof_fatherof_fatherOfException 
    ... 

Quando grep i miei registri su myPrefix, non vedo la traccia dello stack. Abbiamo molti prefissi diversi (uno per modulo)

Grazie in anticipo.

risposta

2

sottoclasse ThrowableRenderer, ad esempio:

import org.apache.log4j.DefaultThrowableRenderer; 
import org.apache.log4j.spi.ThrowableRenderer; 

public class LogThrowableRenderer implements ThrowableRenderer { 

    DefaultThrowableRenderer def = new DefaultThrowableRenderer(); 

    @Override 
    public String[] doRender(Throwable t) { 
     String[] temp = def.doRender(t); 
     for (int i = 0; i < temp.length; i++) { 
      temp[i] = "myPrefix "+temp[i]; 
     } 
     return temp; 
    } 

} 

Aggiungi a yo ur log4j.properties:

log4j.throwableRenderer=whatever.package.LogThrowableRenderer 

Questo utilizza l'esistente DefaultThrowableRenderer per rendere lo StackTrace in modo familiare prima di aggiungere il prefisso, in modo che includerà il Throwable di classe, il messaggio, e la causa.

0

Scrivi una funzione wrapper per farlo per te.

private void writeToLogs(String message, Exception excp) { 
    logger.error("myPrefix\t" + message, excp); 
} 
+0

Grazie per il suggerimento, ma questo non è quello che sto cercando. In primo luogo, farà diversi log invece di uno. 2 °, sto lavorando su un progetto piuttosto grande e non posso immaginare di cambiare ogni logger.log con qualcos'altro. Infine, la tua soluzione non prefisso la riga "at" con il prefisso. Sto cercando una soluzione di configurazione log4j. –

+0

O ok scusami per quello. Non ho molta familiarità con log4j ma quando ho fatto un veloce Google su di esso ho trovato questo, http://logging.apache.org/log4j/1.2/manual.html, potresti averlo già visto, ma se scorri verso il basso fino a Configurazione a metà strada potrebbe aiutarti. Scusa non ho potuto aiutare di più. – Mike

7

riferimento alla risposta di Alex in quanto è uno pulito.

È possibile scrivere una propria implementazione di org.apache.log4j.spi.ThrowableRenderer:

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/spi/ThrowableRenderer.html

Quindi, modificare la configurazione log4j:

log4j.throwableRenderer = your-classe-nome personalizzato

ThrowableRenderer restituisce una serie di String s. Ecco il codice:

String prefix = "myPrefix"; // Or some constant 

List<String> l = new LinkedList<String>(); 
l.add(String.format("%s %s: %s", prefix, t.getClass().getName(), t.getMessage())); 

for (StackTraceElement ste: t.getStackTrace()){ 
    l.add(String.format("%s %s", prefix, ste.toString())); 
} 

return (String[]) l.toArray(); 

Un'altra idea sarebbe quella di stampare il Throwable in un PrintWriter che sta avvolgendo alcune Writer che scrive nella memoria, e poi ri-iterazioni su stringhe delimitate da line.separator, aggiungendo ogni riga a un elenco:

StringWriter sw = new StringWriter(); 
t.printStackTrace(new PrintWriter(sw)); 

List<String> l = new LinkedList<String>(); 
for (String s: sw.toString().split(System.lineSeparator())) { 
    l.add(String.format("%s %s", prefix, s)); 
} 

return (String[]) l.toArray(); 
+0

grazie per questo: ci proverò. –

+2

funziona alla grande, grazie! ma dovevo migrare a log4j 1.2.16 per essere in grado di fare questo –

+1

Questo non gestisce la classe e il messaggio lanciabili, o qualsiasi causa. –