Java System.setErr()不';t在stderr关闭后恢复控制台日志记录

Java System.setErr()不';t在stderr关闭后恢复控制台日志记录,java,logging,stderr,java.util.logging,Java,Logging,Stderr,Java.util.logging,我的应用程序用于将stderrstderr更改为最终将被关闭的流。关闭后,我立即再次使用System.setErr()将stderr更改为工作流,当我的代码执行类似于System.err.println()的操作时,这很好,但登录到控制台(即,stderr)不再起作用。为了解决这个问题,我不得不这样做,然后我自己又回到了房间: ConsoleHandler在构造期间捕获对System.err的引用。另一个解决方案是替换日志树中的所有ConsoleHandler LogManager m

我的应用程序用于将stderr
stderr
更改为最终将被关闭的流。关闭后,我立即再次使用
System.setErr()
stderr
更改为工作流,当我的代码执行类似于
System.err.println()
的操作时,这很好,但登录到控制台(即,
stderr
)不再起作用。

为了解决这个问题,我不得不这样做,然后我自己又回到了房间:


ConsoleHandler在构造期间捕获对System.err的引用。另一个解决方案是替换日志树中的所有ConsoleHandler

    LogManager m = LogManager.getLogManager();
    synchronized (m) {
        Enumeration<String> names = m.getLoggerNames();
        while (names.hasMoreElements()) {
            Logger logger = m.getLogger(names.nextElement());
            if (logger != null) {
                for (Handler h : logger.getHandlers()) {
                    if (h.getClass() == ConsoleHandler.class) {
                        logger.removeHandler(h);
                        h.close();
                        logger.addHandler(new ConsoleHandler());
                    }
                }
            }
        }
    }
LogManager m=LogManager.getLogManager();
同步(m){
枚举名称=m.getLoggerNames();
while(names.hasMoreElements()){
Logger=m.getLogger(names.nextElement());
如果(记录器!=null){
对于(处理程序h:logger.getHandlers()){
if(h.getClass()==ConsoleHandler.class){
logger.removeHandler(h);
h、 close();
addHandler(新的ConsoleHandler());
}
}
}
}
}
System.err.println(“这是写入stderr的”);
//这是斯特尔
PrintStream oldErr=System.err;
试一试{
setErr(新打印流(新文件(“/path/to/File”));
}捕获(例外e){
}
System.err.println(“这已写入文件”);
//请注意,System.err在这里不起作用,因为System.err不再是stderr
//但你在oldErr保留了stderr
试一试{
系统设置错误(oldErr);
}捕获(例外e){
}
System.err.println(“这又写入了stderr”);
    LogManager m = LogManager.getLogManager();
    synchronized (m) {
        Enumeration<String> names = m.getLoggerNames();
        while (names.hasMoreElements()) {
            Logger logger = m.getLogger(names.nextElement());
            if (logger != null) {
                for (Handler h : logger.getHandlers()) {
                    if (h.getClass() == ConsoleHandler.class) {
                        logger.removeHandler(h);
                        h.close();
                        logger.addHandler(new ConsoleHandler());
                    }
                }
            }
        }
    }