在Eclipse中运行程序时,将标准错误与标准错误分开

时间:2009-11-18 17:43:19

标签: eclipse io-redirection

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

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

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


相关: I/O redirection in Eclipse?

4 个答案:

答案 0 :(得分:4)

您是否可以尝试将流标准输出重定向到包含SWT文本的自定义视图,将stderr保留为默认控制台。
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();
    }
}

答案 1 :(得分:2)

从(http://www.eclipsezone.com/eclipse/forums/t52910.html):

如果有人希望通过Eclipse中已部署的插件看到写入System.out / System.err的字符串,那么可以通过从命令提示符eclipse.exe -debug以调试模式运行Eclipse来完成。 或者你可以破解一点来捕获JVM的stderr / stdout(运行Eclipse),如 Redirect stdout and stderr of Eclipse to a file (Eclipse 3.0 on WinXP)

中所述

如果在调试模式下运行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的stdout,而不是stderr。后者   还是去了控制台。

     

因为stderr通常在哪里   打印重要的错误消息,   这是非常不幸的   使我们无法检测到错误   无人看管的工作。

     

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

foo >out 2>&1
     

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

foo 2>&1 | bar
     

管道foo的stdout和stderr   进入酒吧。如果你被DOS困住了,   Stderr就是你所需要的。

     

Stderr运行命令并合并它   stderr进入它的stdout。因此,   重定向或管道标准输出是   相当于做同样的事情   stderr也是。

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

答案 2 :(得分:1)

好吧,您可以将System.out替换为写入文件的PrintStream。我只是把它从袖口上写下来,所以也许它不完全正确,但你明白了:

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

那个,或类似的东西应该做的伎俩。通常进入标准输出的所有输出现在将进入该文件(当您关闭程序时不要忘记关闭()Printstream,否则它不会始终将最后一个数据刷新到文件中。)

当然,如果需要,您也可以使用System.err执行相同的操作。

答案 3 :(得分:0)

现在可以想到两个解决方案,用于在独立控制台中过滤stdout / stderr(但它们不适用于二进制流,因此也就是社区Wiki模式):

  • 要么不重定向任何内容(所有输出都在控制台中),请使用Grep Console之类的插件突出显示相关输出

    http://marianold.schedenig.name/grepconsole/img/grepconsole.png

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

    http://www.certiv.net/images/NTailScreenShot001.jpg

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