Logback + Swing in small tool

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

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

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

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

public class MyConsoleAppender extends AppenderBase { private Encoder encoder = new EchoEncoder(); 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示例文件夹中的CountingConsoleAppender示例)。

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

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

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

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

 /** * A Logback appender that appends messages to a {@link JTextArea}. * @author David Tombs */ public class JTextAreaAppender extends AppenderBase { 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); } } }); } }