Запишите сообщение регистратора в файл и текстовую область, сохраняя поведение по умолчанию в Java

В настоящее время я работаю над регистрацией сообщений из моего приложения в файлах .log. Пока это работает нормально, но теперь я пытаюсь вывести то же сообщение в текстовую область. Я использовал регистратор по умолчанию для всего этого.

Это так, что у меня есть один класс, который выполняет всю работу по регистрации в файле .log и записи того же вывода в текстовую область для просмотра администратором.

Это приложение Java Swing JFrame, содержащее только текстовую область (все, что мне нужно). В фоновом режиме происходит множество процессов, и вся эта активность должна быть зарегистрирована для проверки/отладки.

У меня возникли проблемы с поиском хорошего примера, поэтому мне было интересно, не могли бы вы, ребята, мне помочь.


person Orion    schedule 28.05.2012    source источник
comment
Это текстовое поле на веб-странице?   -  person dbf    schedule 28.05.2012
comment
Нет, это для приложения (не веб)   -  person Orion    schedule 28.05.2012
comment
является текстовой областью из Java AWT, Swing или их фреймворков с графическим интерфейсом???, чтобы быстрее отредактировать свой вопрос с помощью SSCCE , продемонстрировали вашу проблему (ы)   -  person mKorbel    schedule 28.05.2012
comment
Мы говорим о стандартном API ведения журналов Java или о какой-то сторонней библиотеке?   -  person Edwin Dalorzo    schedule 28.05.2012
comment
Я использую регистратор по умолчанию для этого. Все по умолчанию. Приложение не может использовать сторонние библиотеки.   -  person Orion    schedule 28.05.2012


Ответы (3)


В вашем случае, поскольку вы используете ведение журнала JDK по умолчанию, вы можете написать свой собственный java.util.Handler и реализовать метод публикации. Примерно так:

public class TextAreaHandler extends java.util.logging.Handler {

    private JTextArea textArea = new JTextArea(50, 50);

    @Override
    public void publish(final LogRecord record) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                StringWriter text = new StringWriter();
                PrintWriter out = new PrintWriter(text);
                out.println(textArea.getText());
                out.printf("[%s] [Thread-%d]: %s.%s -> %s", record.getLevel(),
                        record.getThreadID(), record.getSourceClassName(),
                        record.getSourceMethodName(), record.getMessage());
                textArea.setText(text.toString());
            }

        });
    }

    public JTextArea getTextArea() {
        return this.textArea;
    }

    //...
}

Затем вы можете получить текстовую область из своего обработчика в приложении Swing, например:

for(Handler handler: logger.getHandlers()){
    if(handler instanceof TextAreaHandler){
        TextAreaHandler textAreaHandler = (TextAreaHandler) handler;
        getContentPane().add(textAreaHandler.getTextArea());
    }
}

Затем убедитесь, что ваш файл logging.properties содержит конфигурацию вашего нового обработчика:

hackers.logging.TestDrive.level=INFO
hackers.logging.TestDrive.handlers=hackers.logging.TextAreaHandler

И, если вы не собираетесь помещать эту конфигурацию в файл logging.properties по умолчанию (расположенный в папке JRE lib), обязательно укажите путь к настроенному файлу logging.properties в свойстве при запуске приложения:

java -Djava.util.logging.config.file=my-customized-logging.properties ...
person Edwin Dalorzo    schedule 28.05.2012

Просто расширяется от StreamHandler — так работают ConsoleHandler и FileHandler. И переопределите функцию publish:

public class TextAreaHandler extends StreamHandler {
    JTextArea textArea = null;

    public void setTextArea(JTextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void publish(LogRecord record) {
        super.publish(record);
        flush();

        if (textArea != null) {
            textArea.appendText(getFormatter().format(record));
        }
    }
}

Установите место вывода перед записью сообщения, например:

public TextAreaHandler textAreaHandler = new TextAreaHandler();
textAreaHandler.setTextArea(<your JTextArea control>);
person Thach Van    schedule 11.02.2015

Если это монолитное приложение, вы можете написать log4j custom appender который вызовет обновление содержимого текстовой области и добавит туда новые строки.
Если есть два независимых приложения (одно, которое создает журналы, и другое, которое их отображает), вы можете установить некую связь между ними (сокет/обмен сообщениями и т.д.) ), чтобы уведомить приложение администратора о зарегистрированных строках и обновить их.

person dbf    schedule 28.05.2012