使用Logger进行Stdout重定向

时间:2015-04-01 18:51:40

标签: 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文本只是“另一个测试”。 当我删除第一个记录器行

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

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

1 个答案:

答案 0 :(得分:1)

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