10

我使用了log4j.Logger并且我已经使用 . 将日志值写入了一个文件FileAppender

现在我想在文本区域中显示日志值。如何将记录器值分配给字符串数组?

4

2 回答 2

15

您可以Appender在您的Logger. 使用WriterAppender写入 aStringWriter然后您将内容更改TextAreaStringWriter#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根据 logLevel 以及内容是否StringWriter更改来找到一种智能方法来更新您的内容。

更新:此处提供了一个类似的解决方案。

于 2012-09-13T09:55:24.323 回答
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;
    }
}
于 2012-10-20T00:39:28.553 回答