2012-09-13 12 views
9

log4j.Logger kullandım ve günlük değerini FileAppender kullanarak bir dosyaya yazdım.Bir dize dizisinde Logger değeri nasıl edinilir

Şimdi günlüğü değerini bir textarea'da göstermek istiyorum. Kaydedici değerini Dizeler dizisine nasıl atayabilirim?

+0

? Stacktrace? veya hata mesajı? – Jaiwo99

+0

Ben Level.TRACE – praba

+2

göstermek istiyorum Doğrudan bir yol görmüyorum ve uygulamanızda göstermek istiyorsanız, dosyayı okuyabilir ve orada gösterebilir –

cevap

13

Logger numaranıza Appender ek ekleyebilirsiniz.

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()); 
    } 
Eğer akıllı bir yol loglevel bağlı senin TextArea güncellemek bulmalıyız

ve: o zaman StringWriter#toString()

Örnek Kanununun değerine senin TextArea içeriğini değiştirebilir, StringWriter yazmak için bir WriterAppender kullanın StringWriter içeriği değiştiyse. Güncelleştirme: Karşılaştırılabilir bir çözüm sunulur here.

+2

+1 güzel çözüm –

+0

stringWriter boş değer döndürür. Bu çalışma değil. bir suistimaller veya çözümler – praba

+1

Bize kodunuzu göstermeniz gerekir. Benim örneğim iyi çalışıyor. – Simulant

3

org.apache.log4j.AppenderSkeleton ve (API'nın önerdiği gibi) append(org.apache.log4j.spi.LoggingEvent) yöntemini geçersiz kılan bir sınıf yazabilirim. LoggingEvent ile göstermek istediğiniz dizeyi oluşturmak için gerekli tüm bilgileri alırsınız. Ayrıca bu dizeleri nereye kaydedeceğinizi de kontrol edebilirsiniz. Onları bir String dizisine sahip olmak istediniz - sorun değil. Son n oturum açma olaylarını yalnızca hatırlamak istiyorsanız, bir sıra kullanabilirsiniz. İşte

benim kodu (geçti basit bir test): etmek istediğini göstermek ne

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