Logback + Swing в маленьком инструменте - PullRequest
4 голосов
/ 27 июля 2010

Мне нужно взломать небольшой инструмент. Стоит прочитать пару файлов и конвертировать их. Прямо сейчас это работает в моей IDE. Для пользователя я хотел бы добавить небольшой пользовательский интерфейс, который просто показывает вывод журнала.

Знаете ли вы о готовом приложении Swing для входа в систему? Или что-то, что перенаправляет System.out на небольшой пользовательский интерфейс, в котором нет ничего, кроме текстового поля и кнопки «Закрыть»?

PS: Я не ищу Бензопилу, Лобзик или Лилит. Я хочу отображение сообщений журнала в приложении, пожалуйста.

Ответы [ 3 ]

5 голосов
/ 07 октября 2011

Вам нужно написать собственный класс 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) {}
  }
}

Вы можете заменить EchoEncoder на PatternLayoutEncoder (см. Пример CountingConsoleAppender в папке примеров выхода из системы).

Кодировщик запишет каждое событие в байтовый буфер, который вы затем можете извлечь строку и записать ее в JTextPane или JTextArea, или в любое другое место.

4 голосов
/ 27 июля 2010

Я часто полагаюсь на JTextArea#append(), как предлагается в этом примере . В отличие от большинства Swing, этот метод является поточно-ориентированным.

Приложение: Console является связанным примером, который перенаправляет System.out и System.err на JTextArea.

0 голосов
/ 26 сентября 2014

Нет гарантии, но вот пример, который я только что написал:

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