我正在尝试将输出重定向到文本区域(将使用以下代码将其嵌入到 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/