Java 用自己的记录器冲洗系统
我创建了自己的小日志,以代替System.out.printlnJava 用自己的记录器冲洗系统,java,logging,java.util.logging,system.out,Java,Logging,Java.util.logging,System.out,我创建了自己的小日志,以代替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()
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.flush
将这些字节强制发送到控制台
由于您不想创建新类,所以可以使用,该类将刷新到控制台,但默认情况下将写入错误流。如果您还没有启动任何其他线程,您可以通过执行以下操作来解决此问题:
//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);
}
子类确实是最好的选择,因为您可以通过调用Handler.close()
通过LogManager.getLogManager().reset()
或调用StreamHandler.setOutputStream
来意外关闭系统.out
,这意味着您根本看不到任何输出
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();
}
}
问题在于,将给定流包装在一个
在写入底层输出流之前,生成的字节在缓冲区中累积。可以指定此缓冲区的大小,但默认情况下,它对于大多数用途来说都足够大
因此,无法调用StreamHandler.flush
将这些字节强制发送到控制台
由于您不想创建新类,所以可以使用,该类将刷新到控制台,但默认情况下将写入错误流。如果您还没有启动任何其他线程,您可以通过执行以下操作来解决此问题:
//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);
}
子类确实是最好的选择,因为您可以通过调用Handler.close()
通过LogManager.getLogManager().reset()
或调用StreamHandler.setOutputStream
来意外关闭系统.out
,这意味着您根本看不到任何输出
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();
}
}
我之所以删除我的答案,是因为在处理程序上调用flush并不是在流上调用flush。你在使用什么JVM、O/S和IDE?Java 8、Windows 10、EclipseEi之所以删除我的答案,是因为在处理程序上调用flush并不是在流上调用flush。你在使用什么JVM、O/S和IDE?Java 8、Windows 10、EclipseFYI。这不会刷新到控制台(PrintStream)jep第一个也不起作用。看起来我不得不不幸地使用子类-。-FYI。这不会刷新到控制台(PrintStream)jep第一个也不起作用。看起来我不得不不幸地使用子类--