System.setErr() 在 stderr 关闭后不恢复控制台日志记录
System.setErr() doesn't restore console logging after stderr closed
我的应用程序使用 System.setErr()
to change stderr
to a stream which will eventually be closed. Immediately after it's closed I immediately use System.setErr()
again to change stderr
to a working stream, which goes fine for when my code does something like System.err.println()
, but logging with java.util.logging
到控制台(即,到 stderr
)不再有效。
为了解决这个问题,我不得不 re-read the logging configuration file and then put back in the 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());
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());
}
}
}
}
}
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");
我的应用程序使用 System.setErr()
to change stderr
to a stream which will eventually be closed. Immediately after it's closed I immediately use System.setErr()
again to change stderr
to a working stream, which goes fine for when my code does something like System.err.println()
, but logging with java.util.logging
到控制台(即,到 stderr
)不再有效。
为了解决这个问题,我不得不 re-read the logging configuration file and then put back in the 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());
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());
}
}
}
}
}
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");