代码之家  ›  专栏  ›  技术社区  ›  Aaron Digulla

Logback+Swing-in小工具

  •  4
  • Aaron Digulla  · 技术社区  · 14 年前

    我需要一个小工具。它应该读取几个文件并转换它们。现在它在我的IDE中工作。对于用户,我想添加一个简单显示日志输出的小UI。

    你知道一个随时可用的Swing appender用于logback吗?或是改变方向的东西系统输出到一个只有文本字段和“关闭”按钮的小UI?

    附言:我不是在找电锯、拼图或莉莉丝。我想在应用程序中显示日志消息。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Aaron Davidson    13 年前

    您需要编写一个自定义appender类,如下所示:

    public class MyConsoleAppender extends AppenderBase<ILoggingEvent> {
      private Encoder<ILoggingEvent> encoder = new EchoEncoder<ILoggingEvent>();
      private ByteArrayOutputStream  out     = new ByteArrayOutputStream();
    
      public MyConsoleAppender() {
         LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
         setContext(lc);
         start();
         lc.getLogger("ROOT").addAppender(this);
      }
    
      @Override
      public void start() {
         try {
            encoder.init(out);
         } catch (IOException e) {}
         super.start();
      }
    
      @Override
      public void append(ILoggingEvent event) {
         try {
            encoder.doEncode(event);
            out.flush();
            String line = out.toString(); // TODO: append _line_ to your JTextPane
            out.reset();
         } catch (IOException e) {}
      }
    }
    

    您可以用PatternLayoutEncoder替换echooncoder(请参阅logback examples文件夹中的CountingConsoleAppender示例)。

    编码器将每个事件写入字节缓冲区,然后您可以提取一个字符串并将其写入JTextPane或JTextArea,或任何您想要的内容。

        2
  •  4
  •   Community Dan Abramov    7 年前

    我经常依赖 JTextArea#append() ,如本文所述 example . 与大多数Swing不同,该方法恰好是线程安全的。

    附录: Console 是重定向的相关示例 System.out System.err JTextArea .

        3
  •  0
  •   David    10 年前

    没有担保,但我刚刚写了一个例子:

    /**
     * A Logback appender that appends messages to a {@link JTextArea}.
     * @author David Tombs
     */
    public class JTextAreaAppender extends AppenderBase<ILoggingEvent>
    {
        private final JTextArea fTextArea;
        private final PatternLayout fPatternLayout;
    
        public JTextAreaAppender(final Context loggerContext, final JTextArea textArea)
        {
            fTextArea = textArea;
    
            // Log the date, level, class name (no package), and the message.
            fPatternLayout = new PatternLayout();
            fPatternLayout.setPattern("%d{HH:mm:ss.SSS} %-5level - %msg");
            fPatternLayout.setContext(loggerContext);
            fPatternLayout.start();
    
            // Make sure not to call any subclass methods right now.
            super.setContext(loggerContext);
        }
    
        @Override
        protected void append(final ILoggingEvent eventObject)
        {
            // Actual appending must be done from the EDT.
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run()
                {
                    final String logStr = fPatternLayout.doLayout(eventObject);
    
                    // If the text area already has lines in it, append a newline first.
                    if (fTextArea.getDocument().getLength() > 0)
                    {
                        fTextArea.append("\n" + logStr);
                    }
                    else
                    {
                        fTextArea.setText(logStr);
                    }
                }
            });
        }    
    }