我使用了log4j.Logger
并且我已经使用 . 将日志值写入了一个文件FileAppender
。
现在我想在文本区域中显示日志值。如何将记录器值分配给字符串数组?
您可以Appender
在您的Logger
. 使用WriterAppender写入 aStringWriter
然后您将内容更改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
更改来找到一种智能方法来更新您的内容。
更新:此处提供了一个类似的解决方案。
我会编写一个扩展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;
}
}