我使用了 log4j.Logger
,并使用 FileAppender
将日志值写入文件中。
现在,我想在一个文本框中显示日志值。我该如何将记录器值赋给字符串数组?
我使用了 log4j.Logger
,并使用 FileAppender
将日志值写入文件中。
现在,我想在一个文本框中显示日志值。我该如何将记录器值赋给字符串数组?
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
。我会写一个继承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;
}
}