Ведение журнала Java Уровни журнала с несколькими обработчиками, включая настраиваемый обработчик

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

studium.logger.useParentHandlers = false

studium.logger.ProjectLogger.handlers = java.util.logging.FileHandler, studium.logger.WindowHandler


studium.logger.ProjectLogger.level = FINEST


studium.logger.WindowHandler.formatter = studium.logger.formatter.TextAreaFormatter
studium.logger.WindowHandler.level = INFO

java.util.logging.FileHandler.level = FINEST
java.util.logging.FileHandler.formatter = studium.logger.formatter.FileFormatter
java.util.logging.FileHandler.append    = true
java.util.logging.FileHandler.pattern   = log.txt

Обработчик файлов работает нормально. Он хорошо зарегистрирован в моем файле журнала. Но с моим WindowHandler я все еще получаю все журналы с уровнем журнала Fine, а не только Info и Warning

вот мой WindowHandler:

public class WindowHandler extends StreamHandler {

    private JTextArea textArea;

    public WindowHandler() {
        super();
        this.textArea = MainFrame.out;
    }

    @Override
    public void publish(LogRecord record) {
        textArea.append(getFormatter().format(record));
    }

    public JTextArea getTextArea() {
        return textArea;
    }

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

}

И вот вывод в моей текстовой области:

FINE Test log level FINE
WARNING Test log level WARNING

Что мне не хватает?


person TheSilent    schedule 09.05.2017    source источник


Ответы (1)


Игнорируя проблему потоков Swing в вашем коде, вы должны вызывать Handler.isLoggable(Record), поэтому ваш метод публикации учитывает установленный вами уровень ведения журнала.

public void publish(LogRecord record) {
    if (isLoggable(record)) {
       textArea.append(getFormatter().format(record));
    }
}

Устранение проблем с потоками и обработкой исключений должно закончиться чем-то вроде:

@Override
public void publish(LogRecord record) {
    if (isLoggable(record)) {
        try {
            final String val = getFormatter().format(record);
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                    try {
                        getArea().append(val);
                    } catch (RuntimeException e) {
                        reportError(val, e, ErrorManager.WRITE_FAILURE);
                    }
                }
            });
        } catch (RuntimeException e) {
            reportError(null, e, ErrorManager.WRITE_FAILURE);
        }
    }
}

private JTextArea getArea() {
    if (!SwingUtilities.isEventDispatchThread()) {
       throw new IllegalThreadStateException(Thread.currentThread().toString());
    }
    return null; //@todo Implement this.
}
person jmehrens    schedule 10.05.2017
comment
Оно работает! Спасибо большое, это меня напугало :D - person TheSilent; 10.05.2017