2012-09-13 40 views
9

我使用了log4j.Logger,並且我使用FileAppender將日誌值寫入文件中。如何獲取字符串數組中的記錄器值

現在我想在textarea中顯示日誌值。如何將記錄器值分配給一個字符串數組?

+0

什麼做你想做的節目?堆棧跟蹤?或錯誤消息? – Jaiwo99

+0

我想顯示Level.TRACE – praba

+2

我沒有看到直接的方式,如果你想在你的應用程序中顯示,你可以閱讀該文件並在那裏顯示 –

回答

13

您可以將另外的Appender添加到Logger。使用WriterAppender寫入一個StringWriter那麼你TextArea的內容更改爲StringWriter#toString()

示例代碼的價值:

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

,你需要找到一個聰明的方式更新TextArea取決於日誌級別和如果StringWriter的內容改變了。

更新:提供了類似的解決方案here

+2

+1不錯的解決方案 –

+0

stringWriter返回空值。它不工作。任何暗示或解決方案 – praba

+1

您需要向我們介紹您的代碼。我的例子ist正常工作。 – Simulant

3

我會寫一個擴展了org.apache.log4j.AppenderSkeleton的類,並且(如API建議的)覆蓋append(org.apache.log4j.spi.LoggingEvent)方法。通過LoggingEvent,您可以獲得所有必要的信息來構建要顯示的字符串。您也可以控制保存這些字符串的位置。你想讓他們在一個字符串數組中 - 沒問題。如果您只想記住最近n次記錄事件,則可以使用隊列。

這裏我的代碼(通過一個簡單的測試):

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; 
    } 
} 
相關問題