我使用log4j.Logger
并使用FileAppender
将日志值写入文件。
现在我想在textarea中显示日志值。如何将记录器值分配给字符串数组?
答案 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;
}
}