将Handler添加到每个Logger

时间:2015-11-05 18:41:11

标签: java logging java-8 java.util.logging

我想为每个项目的每个类添加一个自定义处理程序。我有一个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
    }
}

日志文件的读取没有问题,因为没有更多的INFO或WARNING消息打印到控制台,只有SEVERE。但我的自定义处理程序从未被调用,因为没有打开任何警报窗口。我还尝试将处理程序添加到全局记录器中,希望其他所有记录器继承其处理程序,但它也不起作用:

Logger.getGlobal().addHandler(new AlertHandler());
Logger.getLogger("").addHandler(new AlertHandler());

将处理程序添加到特定记录器按预期工作:如果在类中的任何位置引发错误,则会使用堆栈跟踪打开警报窗口。

Logger.getLogger("mySecondClass").addHandler(new AlertHandler());

但是我想把这个处理程序添加到任何类的每个记录器中!

0 个答案:

没有答案