I used the log4j.Logger
and I have written the log value in to a file using the FileAppender
.
Now I want to show the log value in a textare
You can add an additional Appender
to your Logger
. Use a WriterAppender to write to a StringWriter
then you change the content of your TextArea
to the value of StringWriter#toString()
Example Code:
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());
}
you need to find a smart way update your TextArea
depending on the logLevel and if the content of the StringWriter
changed.
Update: A comparable solution is presented here.
I would write a class that extends org.apache.log4j.AppenderSkeleton and (as the API suggests) override the append(org.apache.log4j.spi.LoggingEvent) method. With the LoggingEvent you get all necessary information to build the String you want to show. Also you can control where to save those Strings. You wanted to have them in a String array - no problem. If you only want to remember the last n logging events, you could use a queue.
Here my code (passed a simple test):
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;
}
}