2012-09-13 4 views
9

Ho utilizzato il log4j.Logger e ho scritto il valore del registro in un file utilizzando FileAppender.Come ottenere il valore del logger in un array di stringhe

Ora voglio mostrare il valore del registro in una textarea. Come posso assegnare il valore del logger ad un array di stringhe?

+0

ciò che si vuole fare spettacolo? lo stacktrace? o un messaggio di errore? – Jaiwo99

+0

voglio mostrare il Level.TRACE – praba

+2

non vedo un modo diretto e se vuoi mostrare nella tua applicazione, puoi leggere il file e mostrarlo lì –

risposta

13

È possibile aggiungere un ulteriore Appender al numero Logger. Utilizzare un WriterAppender per scrivere su un StringWriter quindi si modifica il contenuto del tuo TextArea al valore del StringWriter#toString()

Esempio di codice:

public static void main(String[] args) { 
    Logger logger = Logger.getLogger("logger"); 
    Layout layout = new PatternLayout(); 
    StringWriter stringWriter = new StringWriter(); 
    WriterAppender writerAppender = new WriterAppender(layout, stringWriter); 
    logger.addAppender(writerAppender); 
    TextArea textArea = new TextArea(); 

    logger.error("test"); 
    //if(stringWriter changed){// compare to old TextArea-content? 
     textArea.setText(stringWriter.toString()); 
    //} 
    //System.out.println(stringWriter.toString()); 
    } 

è necessario trovare un modo intelligente aggiornare il TextArea a seconda del logLevel e se il contenuto di StringWriter è cambiato.

Aggiornamento: viene presentata una soluzione comparabile here.

+2

+1 nice solution –

+0

stringWriter restituisce un valore vuoto. non funziona.anche suggerimenti o soluzioni – praba

+1

Hai bisogno di presentarci il tuo codice. Il mio esempio funziona bene. – Simulant

3

Scriverò una classe che si estende org.apache.log4j.AppenderSkeleton e (come suggerisce l'API) sovrascrive il metodo append(org.apache.log4j.spi.LoggingEvent). Con lo LoggingEvent ottieni tutte le informazioni necessarie per costruire la stringa che desideri mostrare. Inoltre puoi controllare dove salvare quelle stringhe. Volevi averli in un array di stringhe - nessun problema. Se si desidera ricordare solo gli ultimi n eventi di registrazione, è possibile utilizzare una coda.

Ecco il mio codice (superato un semplice test):

import java.util.ArrayDeque; 
import java.util.Collection; 
import java.util.Collections; 

import org.apache.log4j.AppenderSkeleton; 
import org.apache.log4j.spi.LoggingEvent; 


public class StringArrayAppender extends AppenderSkeleton{ 

    private Collection<String> log; 

    private int size; 

    public StringArrayAppender(int size) { 
     this.log = new ArrayDeque<String>(size); 
     this.size = size; 
    } 

    public String[] getLog() { 
     return log.toArray(new String[0]); 
    } 

    @Override 
    protected void append(LoggingEvent event) { 
     // Generate message 
     StringBuilder sb = new StringBuilder(); 
     sb.append(event.getTimeStamp()).append(": "); 
     sb.append(event.getLevel().toString()).append(": "); 
     sb.append(event.getRenderedMessage().toString()); 
     // add it to queue 
     if(log.size() == size) { 
      ((ArrayDeque<String>) log).removeFirst(); 
     } 
     log.add(sb.toString()); 
    } 

    @Override 
    public void close() { 
     log = Collections.unmodifiableCollection(log); 
    } 

    @Override 
    public boolean requiresLayout() { 
     return false; 
    } 
} 
Problemi correlati