gpt4 book ai didi

java - 我可以防止 `java.util.logging.LogManager` 关闭得太快吗?

转载 作者:行者123 更新时间:2023-12-01 10:06:47 24 4
gpt4 key购买 nike

我的 Java 程序在 Linux 上运行,需要在关闭之前关闭一些文件句柄(实际上是设备),因此我在 JVM 上添加了一个关闭 Hook 。但是,我注意到 java.util.logging.LogManager 也有一个关闭钩子(Hook),并且它往往会在我关闭之前关闭,这意味着我无法记录有关关闭过程的任何信息.

有没有办法阻止 LogManager 安装其关闭 Hook ,以便我可以在关闭时执行日志记录,然后告诉它在我准备好时进行清理?

最佳答案

使 LogManager 清理线程加入您的关闭 Hook 或通过安装自定义处理程序直接执行文件清理。清理线程将按顺序枚举记录器并尝试关闭附加的处理程序。只要您的处理程序是第一个尝试关闭的处理程序,您就可以控制清理程序的执行时间。

public class ShutdownHandler extends Handler {

public static void main(String[] args) {
install();
}

private static void install() {
LogManager lm = LogManager.getLogManager();
Logger first = null;
ShutdownHandler sh = new ShutdownHandler();
for (;;) {
try {
Enumeration<String> e = lm.getLoggerNames();
while (e.hasMoreElements()) {
first = lm.getLogger(e.nextElement());
if (first != null) {
break;
}
}
break;
} catch (ConcurrentModificationException olderJvm) {
}
}

Logger.getLogger("").addHandler(sh);
if (first != null) {
first.addHandler(sh);
}
}

public ShutdownHandler() {
super.setLevel(Level.ALL);
}

@Override
public void publish(LogRecord record) {
}

@Override
public void flush() {
}

@Override
public void close() throws SecurityException {
if (!Level.OFF.equals(super.getLevel())) {
super.setLevel(Level.OFF);
shutDown();
}
}

private void shutDown() {
System.out.println(this + " shutdown by "
+ Thread.currentThread().getClass().getName());
//Close your files or join with your other shutdown hook.
}
}

关于java - 我可以防止 `java.util.logging.LogManager` 关闭得太快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36388969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com