Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用自己的记录器冲洗系统_Java_Logging_Java.util.logging_System.out - Fatal编程技术网

Java 用自己的记录器冲洗系统

Java 用自己的记录器冲洗系统,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()

我创建了自己的小日志,以代替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.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第一个也不起作用。看起来我不得不不幸地使用子类--