Logback + Swing in small tool

时间:2010-07-27 12:32:54

标签: java user-interface swing logging logback

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

你知道一个现成的Swing appender用于logback吗?或者将System.out重定向到只有文本字段和“关闭”按钮的小UI的东西?

PS:我不是在寻找Chainsaw或Jigsaw或Lilith。我想在应用程序中显示日志消息。

3 个答案:

答案 0 :(得分:5)

您需要编写一个自定义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替换EchoEncoder(请参阅logback examples文件夹中的CountingConsoleAppender示例)。

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

答案 1 :(得分:4)

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

附录:Console是将System.outSystem.err重定向到JTextArea的相关示例。

答案 2 :(得分:0)

没有保修,但这是我刚才写的样本:

/**
 * 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);
                }
            }
        });
    }    
}