如何在字符串数组中获取Logger值

时间:2012-09-13 09:05:45

标签: java struts2 log4j

我使用log4j.Logger并使用FileAppender将日志值写入文件。

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

2 个答案:

答案 0 :(得分:14)

您可以向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,具体取决于logLevel以及StringWriter的内容是否已更改。

更新:提供了一个类似的解决方案here

答案 1 :(得分:3)

我会编写一个扩展org.apache.log4j.AppenderSkeleton的类,并且(如API建议的那样)覆盖append(org.apache.log4j.spi.LoggingEvent)方法。使用LoggingEvent,您将获得构建要显示的String的所有必要信息。您还可以控制保存这些字符串的位置。你想让它们在String数组中 - 没问题。如果您只想记住最后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;
    }
}