【问题标题】:Separate standard output from standard error when running a program in Eclipse在 Eclipse 中运行程序时将标准输出与标准错误分开
【发布时间】:2009-11-18 17:43:18
【问题描述】:

我正在 Eclipse 中调试 Java 程序。该程序通常将二进制数据写入其标准输出,但它可以将错误消息和堆栈跟踪写入其标准错误流。

我想将二进制数据重定向到一个文件,同时继续在控制台中显示标准错误输出。从命令行运行时,这很简单。 Eclipse下可以吗?

到目前为止,我只知道如何将标准输出和标准错误重定向到同一个文件。除了向程序添加一个新的命令行选项之外,我看不到将两者分开的方法。


相关:I/O redirection in Eclipse?

【问题讨论】:

    标签: eclipse io-redirection


    【解决方案1】:

    您能否尝试将您的流标准输出重定向到其中包含 SWT 文本的自定义视图,而将标准错误留给默认控制台。
    this thread

    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintStream;
    
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.*;
    
    
    public class ConsumeSysout {
    
    
        public static void main(String[] args) {
            Display display = new Display();
            Shell shell = new Shell(display);
            shell.setLayout(new FillLayout());
            final Text text = new Text(shell, SWT.NONE);
            shell.open();
    
    
            OutputStream out = new OutputStream() {
                @Override
                public void write(int b) throws IOException {
                   text.append(Character.toString((char) b));
                }
            };
            System.setOut(new PrintStream(out));
    
    
            System.out.println("Hello World!");
    
    
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
            display.dispose();
        }
    }
    

    【讨论】:

      【解决方案2】:

      发件人(http://www.eclipsezone.com/eclipse/forums/t52910.html):

      如果有人想查看已在 Eclipse 中部署的插件写入 System.out/System.err 的字符串,则可以通过在命令提示符下以调试模式运行 Eclipse 作为eclipse.exe -debug 来完成。 否则,您可以按照 Redirect stdout and stderr of Eclipse to a file (Eclipse 3.0 on WinXP)

      中的说明进行一些破解以捕获 JVM(运行 Eclipse)的 stderr/stdout

      如果您在调试模式下运行 Eclipse,您应该能够从命令行启动它并包含一个 stderr 重定向。在 Unix 中,它将是“命令 2> 文件”。

      本帖有相关内容:Redirect STDERR / STDOUT of a process AFTER it's been started, using command line?

      这个链接更多是 DOS/Windows 特定的:Stderr

      DOS shell command.com 不提供 意味着重定向stderr。因为 那,不可能保存到 文件或管道进入程序, 程序打印到的消息 标准错误。 "foo >out" 只重定向 foo 的标准输出,而不是标准错误。后者 仍然进入控制台。

      因为 stderr 通常是 打印重要的错误信息, 这是非常不幸的,因为这 使我们无法检测到错误 无人值守的工作。

      那你是做什么的?一种解决方案是 切换到 shell 允许的 Unix 一个重定向stderr。用 sh 和 它的衍生物,使用

      foo >out 2>&1
      

      保存 foo 的 stdout 和 stderr 出去。同样,使用

      foo 2>&1 | bar
      

      通过管道传输 foo 的 stdout 和 stderr 进酒吧。如果你被 DOS 卡住了, Stderr 是您所需要的。

      Stderr 运行一个命令并合并它的 标准错误进入其标准输出。所以, 重定向或管道标准输出是 相当于做同样的事情 标准错误也是如此。

      我将不得不继续寻找 Windows 解决方案。 PowerShell 已经流行起来,可能值得一试。

      【讨论】:

      • 有趣的想法和链接。 +1
      • 重定向does work with CMD(例如,一个 Windows .bat 文件调用)。示例:2> nul 将标准错误重定向到空流。
      【解决方案3】:

      好吧,您可以将 System.out 替换为您自己的 PrintStream 写入文件。我只是临时写下这个,所以也许它并不完全正确,但你明白了:

      FileOutputStream fos = new FileOutputStream("c:\myfile.bin");
      BufferedOutputStream bos = new BufferedOutputStream(fos);
      PrintStream ps = new PrintStream(bos);
      System.out = ps;
      

      那个,或者类似的东西应该可以解决问题。通常进入标准输出的所有输出现在都将进入该文件(当您关闭程序时不要忘记 close() 打印流,否则它不会总是将最后的数据刷新到文件中。)

      当然,如果你愿意,你也可以用 System.err 做同样的事情。

      【讨论】:

      • 这可行,但我希望能在 IDE 中找到一种方法,无需修改应用程序的 I/O 代码
      【解决方案4】:

      现在想到了两种在独立控制台中过滤标准输出/标准错误的解决方案(但它们不适用于二进制流,因此是 Community-Wiki 模式):

      • 要么不重定向任何东西(所有输出都在控制台中),并使用像 Grep Console 这样的插件来突出显示相关输出

      • 和/或重定向文件中的所有内容,并使用像 NTail 这样的插件并使用一些“过滤行”从日志文件显示中排除选定的行(这可能更接近您正在寻找的内容)。

      (您可以根据需要/想要定义多个 NTail 视图。)

      【讨论】:

      • NTail 专为文本过滤而设计,不适用于我的程序通常写入标准输出的 二进制 数据。
      • 正确...二进制。哎呀。我在 Community-Wiki 模式下将此答案留作存档。
      • 两个图片链接坏了。
      • @PeterMortensen 谢谢。我已恢复图片及其相关链接。
      猜你喜欢
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2013-05-11
      • 2016-01-10
      • 2013-01-30
      相关资源
      最近更新 更多