2012-09-13 4 views
9

Utilicé el log4j.Logger y escribí el valor de registro en un archivo con el FileAppender.Cómo obtener el valor del registrador en una matriz de cadenas

Ahora quiero mostrar el valor de registro en un área de texto. ¿Cómo puedo asignar el valor del registrador a una matriz de cadenas?

+0

lo que quieren hacer espectáculo? la stacktrace? o mensaje de error? – Jaiwo99

+0

quiero mostrar el Level.TRACE – praba

+2

no veo una forma directa y si desea mostrar en su aplicación, puede leer el archivo y mostrarlo allí –

Respuesta

13

Puede agregar un Appender adicional a su Logger. Use un WriterAppender escribir en un StringWriter continuación, cambia el contenido de su TextArea al valor de StringWriter#toString()

Ejemplo de código:

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

es necesario encontrar actualizar una manera inteligente su TextArea dependiendo de la logLevel y si el contenido del StringWriter ha cambiado.

Actualización: Se presenta una solución comparable here.

+2

+1 buena solución –

+0

stringWriter devuelve el valor vacío. no está funcionando. Cualquier sugerencia o solución – praba

+1

Debe presentarnos su código. Mi ejemplo está funcionando bien. – Simulant

3

Escribiría una clase que extienda org.apache.log4j.AppenderSkeleton y (como sugiere la API) anule el método append(org.apache.log4j.spi.LoggingEvent). Con el LoggingEvent obtienes toda la información necesaria para compilar el String que deseas mostrar. También puedes controlar dónde guardar esas cadenas. Querías tenerlos en una matriz String, no hay problema. Si solo desea recordar los últimos n eventos de registro, podría usar una cola.

Aquí mi código (pasado una prueba sencilla):

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; 
    } 
} 
Cuestiones relacionadas