How to get Logger value in a string array

后端 未结 2 1700
逝去的感伤
逝去的感伤 2020-12-31 12:53

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

相关标签:
2条回答
  • 2020-12-31 13:01

    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.

    0 讨论(0)
  • 2020-12-31 13:13

    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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题