gpt4 book ai didi

java - 使用自己的记录器刷新 System.out

转载 作者:行者123 更新时间:2023-12-02 02:53:24 25 4
gpt4 key购买 nike

我创建了自己的小记录器来代替 System.out.println

LogManager.getLogManager().reset();
logger = Logger.getLogger(this.toString());
logger.setLevel(loglevel);
Formatter formatter = new Formatter() {
public String format(LogRecord record) {
return new Date().toString().substring(11, 20) + record.getLevel()+" " + formatMessage(record) + System.getProperty("line.separator");
}
};
logger.addHandler(new StreamHandler(System.out, formatter));
LogManager.getLogManager().addLogger(logger);

目前,消息不会被刷新,因此它们仅在应用程序终止后才会出现。有没有一种方法可以在打印消息后刷新消息,而无需创建新类或添加许多行代码?我想让这段代码尽可能短...

最佳答案

问题是 StreamHandler.setOutputStream将给定流包装在 OutputStreamWriter 中根据javadocs :

The resulting bytes are accumulated in a buffer before being written to the underlying output stream. The size of this buffer may be specified, but by default it is large enough for most purposes.

因此,无法调用 StreamHandler.flush 将这些字节强制发送到控制台。

由于您不想创建新类,因此可以使用 ConsoleHandler它将刷新到控制台,但默认情况下将写入错误流。如果您尚未启动任何其他线程,则可以通过执行以下操作来解决这个问题:

//Global resource so ensure single thread.
final PrintStream err = System.err;
System.setErr(System.out);
try {
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);
} finally {
System.setErr(err);
}

子类确实是您最好的选择,因为您最终可能会通过 LogManager.getLogManager() 调用 Handler.close() 意外关闭 System.out ).reset() 或通过调用 StreamHandler.setOutputStream 这意味着您根本看不到任何输出。

public class OutConsoleHandler extends StreamHandler {
public OutConsoleHandler(OutputStream out, Formatter f) {
super(out, f);
}

@Override
public synchronized void publish(LogRecord record) {
super.publish(record);
flush();
}

@Override
public void close() throws SecurityException {
flush();
}
}

关于java - 使用自己的记录器刷新 System.out,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43452140/

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