java - 使用 Logger 进行标准输出重定向

标签 java logging

我正在尝试将输出重定向到文本区域(将使用以下代码将其嵌入到 JFrame 中的某个位置

public static void main(String[] args) {
    Logger.getLogger(MyClass.class.getName()).info("Test");

    final JTextArea x = new JTextArea();

    PrintStream printStream = new PrintStream(new OutputStream(){
        @Override
        public void write(int b) throws IOException {
            x.append(String.valueOf((char)b));
               x.setCaretPosition(x.getDocument().getLength());
        }
    });

    System.setOut(printStream);
    System.setErr(printStream);

    Logger.getLogger(MyClass.class.getName()).info("Test again");
    System.out.println("Another test");

    JOptionPane.showMessageDialog(null, x.getText());
}

但是,当执行最后一行时,JOptionPane 文本仅为“Another test”。 当我删除第一个 Logger 行时

Logger.getLogger(MyClass.class.getName()).info("Test");

然后一切都被重定向到 JTextArea。我怀疑在第一行中记录“Test”后,类 Logger 绑定(bind)到控制台输出,并且即使 stdout 重定向到 TextArea 也不会放弃。

最佳答案

主方法的第一行captures the current System.err stream 。如果您在创建根记录器处理程序之前重新映射流,它将起作用。您还可以更改代码以创建新的 ConsoleHandler并在重新映射错误流后将其添加到根记录器。留意违反 EDT rules of Swing 的行为与您当前的实现。

关于java - 使用 Logger 进行标准输出重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29398535/

相关文章:

java - Spring Boot 1.5.x 未写入logging.file处的文件

java - log4j,国外日志记录

java - 线程 "main"java.lang.NoClassDefFoundError : org/mockito/Mockito 中的异常

performance - 记录用户事件 IP 地址的成本

java - 我可以在另一个注释中使用属性中的 Spring @Value 变量吗?

Java 进程优先于其他 Windows 进程

windows - cURL 输出到文件

java - HTTP Builder 中的 LogFactory 记录器级别

java - MySQL 工作台未连接到数据库

java - 执行三四天后,通过 spring 注入(inject) "While True"循环的线程停止