我想为我的项目的每个类的每个记录器添加一个自定义处理程序。我有一个logging.properties文件,这是在一开始就使用阅读:添加处理程序到每个记录器
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
}
}
测井文件被读取,而不问题,因为没有更多信息或警告消息被打印到控制台,只有严重。但我的自定义处理程序永远不会被调用,因为没有警报窗口打开。我也尝试添加了处理全球记录,在所有其他记录的希望继承它的处理程序,但它不工作,要么:
Logger.getGlobal().addHandler(new AlertHandler());
Logger.getLogger("").addHandler(new AlertHandler());
添加处理程序,以一个特定的记录按预期工作:如果有错误被扔在课堂的任何地方,随着堆栈跟踪打开一个警告窗口。
Logger.getLogger("mySecondClass").addHandler(new AlertHandler());
但我想把这个处理程序添加到任何类的每个记录器!
那么当我手动添加它到某个记录器它的工作,说: Logger.getLogger(“mySecondClass”)。addHandler(new AlertHandler()); ...当这个类中的任何地方抛出异常时,会打开一个警告窗口,所以我非常肯定Handler的工作原理! – user2336377
您确定处理程序正常工作,但javac说这个示例不能编译。'错误:找不到符号 a =新的警报(Alert.AlertType.ERROR); 符号:变量a'我的意见似乎并没有影响到javac。单元测试将真正帮助你。 – jmehrens
对不起,这是一个复制和粘贴错误-.-。起初,我把Alert作为一个类字段,而不是一个局部变量^^修正了这个问题! – user2336377