Я хочу добавить пользовательский обработчик для каждого регистратора для каждого класса моего проекта. У меня есть logging.properties файл, который читается в самом начале использования:add Handler to every Logger
try (InputStream in = ReportingService.class.getResourceAsStream("logging.properties")) {
LogManager.getLogManager().readConfiguration(in);
} catch (IOException ex) {
Logger.getLogger(myClass.class.getName()).log(Level.SEVERE, null, ex);
}
Файл logging.properties выглядит следующим образом:
handlers=java.util.logging.ConsoleHandler,myPackage.AlertHandler
.level=SEVERE
java.util.logging.ConsoleHandler.level=SEVERE
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
myPackage.AlertHandler.level=SEVERE
myPackage.AlertHandler.formatter=java.util.logging.SimpleFormatter
И myPackage.AlertHandler.java выглядит следующим образом:
package myPackage;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import javafx.scene.control.Alert;
public class AlertHandler extends Handler {
@Override
public void publish(LogRecord lr) {
Alert a = new Alert(Alert.AlertType.ERROR);
a.setTitle("Exception!");
a.setHeaderText("Exception was thrown, here is the StackTrace:");
a.setContentText(getFormatter().formatMessage(lr));
Platform.runLater(()->{a.showAndWait();});
}
@Override
public void flush() {
//no real handler is open, nothing to flush
}
@Override
public void close() throws SecurityException {
//no real handler is open, nothing to close
}
}
файл регистрации читается без проблем, так как больше нет INFO или предупреждающие сообщения, не выводятся на консоль, только ТЯЖЕЛАЯ. Но мой пользовательский обработчик никогда не вызывается, поскольку окна с предупреждением никогда не открываются. Я также попытался добавить обработчик к глобальному регистратору, в надежде на любой другой регистратор унаследует его обработчики, но он не работает либо:
Logger.getGlobal().addHandler(new AlertHandler());
Logger.getLogger("").addHandler(new AlertHandler());
Добавление обработчика для конкретного регистратора работает как задумано: если ошибка бросается в любом месте класса, окно предупреждения открывается с помощью stacktrace.
Logger.getLogger("mySecondClass").addHandler(new AlertHandler());
Но я хочу добавить этот обработчик для КАЖДОГО регистратора в любом классе!
Ну, когда я добавляю его вручную для определенного регистратора, он работает, скажем: Logger.getLogger («mySecondClass»). AddHandler (новый AlertHandler()); ... Если исключения исключены из этого класса, открывается окно предупреждения, поэтому я уверен, что обработчик работает! – user2336377
Вы уверены, что обработчик работает, но javac говорит, что этот пример не компилируется.'ошибка: не удается найти символ a = new Alert (Alert.AlertType.ERROR); символ: переменная a. Мое мнение, похоже, не влияет на javac. Тестирование модулей действительно поможет вам. – jmehrens
Ах, извините, что это была копия и вставка ошибки -.-. Сначала у меня было Alert как поле класса, а не локальная переменная ^^ Исправлено это в вопросе! – user2336377