我正在Eclipse中调试Java程序。该程序通常将二进制数据写入其标准输出,但它可以将错误消息和堆栈跟踪写入其标准错误流。
我想将二进制数据重定向到文件,同时继续在控制台中显示标准错误输出。从命令行运行时,这很简单。在Eclipse下可以吗?
到目前为止,我只想出了如何将标准输出和标准错误重定向到同一个文件。除了向程序添加新的命令行选项之外,我看不到将两者分开的方法。
答案 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之类的插件突出显示相关输出
和/或重定向文件中的所有内容,并使用NTail之类的插件并使用一些“过滤行”从日志文件显示中排除选定的行(可能更接近您正在查看的内容)对)。
(您可以根据需要定义许多NTail视图。)