stderr关闭后,System.setErr()不会恢复控制台日志记录

问题描述 投票:0回答:3

我的应用程序使用System.setErr()stderr更改为最终将关闭的流。关闭之后,我立即再次使用System.setErr()stderr更改为工作流,这在我的代码执行类似System.err.println()的情况下很好,但使用java.util.logging登录控制台(即stderr)不再有效。

java logging stderr java.util.logging
3个回答
0
投票

为了解决这个问题,我不得不re-read the logging configuration file,然后自己回到console logging handler

import java.util.logging.ConsoleHandler;
import java.util.logging.Loggger;
import java.util.logging.LogManager;

...

System.setErr(otherStream);

try {
    LogManager.getLogManager().readConfiguration();
}
catch(java.io.IOException e) {
    // ...
}

Logger.getGlobal().addHandler(new ConsoleHandler());

0
投票

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());
                    }
                }
            }
        }
    }

0
投票
System.err.println("This is written to stderr");

// this is stderr
PrintStream oldErr = System.err;

try {
    System.setErr(new PrintStream(new File("/path/to/file")));
} catch(Exception e) {
}


System.err.println("This is written to the file");

// note that System.err wouldn't work here because System.err is no longer stderr
// but you preserved stderr in oldErr
try {
    System.setErr(oldErr);
} catch(Exception e) {
}

System.err.println("This is written to stderr again");
© www.soinside.com 2019 - 2024. All rights reserved.