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

11

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

现在,我想在一个文本框中显示日志值。我该如何将记录器值赋给字符串数组?


你想展示什么?堆栈跟踪还是错误消息? - Jaiwo99
我想要显示 Level.TRACE。 - user1255899
2
我没有看到直接的方法,如果你想在你的应用程序中展示,你可以读取文件并在那里显示。 - Umesh Awasthi
@UmeshAwasthi 哈哈哈..没错..这应该是最简单的方法... - Jaiwo99
@praba,我不太清楚你想要什么,能否再详细解释一下? - Amandeep Jiddewar
2个回答

15
你可以向你的Logger添加一个额外的Appender。使用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());
  }

你需要找到一种聪明的方法,根据日志级别和StringWriter内容的变化来更新TextArea
更新:这里提供了一个可比较的解决方案 here

stringWriter 返回空值。它不起作用。有什么建议或解决方案吗? - user1255899
我只能看到一个线程的输出。我的Eclipse控制台显示其他线程也在记录日志,但我没有看到它们的输出。有没有办法也捕获它们的输出? - amos
如果我编写这样的代码来创建每个请求基础上的附加器,并在请求被服务器处理时将其删除,这样会起作用吗? - Kalpesh Soni

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接