Отдельный стандартный вывод от стандартной ошибки при запуске программы в Eclipse - PullRequest
3 голосов
/ 18 ноября 2009

Я отлаживаю программу на Java в Eclipse. Эта программа обычно записывает двоичные данные в свой стандартный вывод, но она может записывать сообщения об ошибках и трассировки стека в свой стандартный поток ошибок.

Я хотел бы перенаправить двоичные данные в файл, продолжая показывать стандартный вывод ошибок в консоли. Это тривиально при запуске из командной строки. Возможно ли это в Eclipse?

До сих пор я только понял, как перенаправить стандартный вывод и стандартную ошибку в один и тот же файл. Я не вижу способа разделить их, кроме добавления нового параметра командной строки в программу.


Похожие: Перенаправление ввода / вывода в Eclipse?

Ответы [ 4 ]

4 голосов
/ 26 ноября 2009

Можете ли вы попытаться перенаправить стандартный поток вывода в пользовательский просмотр с текстом SWT, оставив stderr на консоли по умолчанию. Смотрите эту тему

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 голосов
/ 03 декабря 2009

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

Если кто-то хотел бы видеть строки, записанные в System.out / System.err уже развернутым плагином в Eclipse, то это можно сделать, запустив Eclipse в режиме отладки из командной строки как eclipse.exe -debug. Или же вы можете немного взломать, чтобы захватить stderr / stdout JVM (работает Eclipse), как описано в Перенаправить stdout и stderr Eclipse в файл (Eclipse 3.0 на WinXP)

Если вы запустите Eclipse в режиме отладки, вы сможете запустить его из командной строки и включить перенаправление stderr. В Unix это будет «команда 2> файл».

Этот поток имеет некоторое связанное содержимое: Перенаправить STDERR / STDOUT процесса ПОСЛЕ его запуска с использованием командной строки?

Эта ссылка более специфична для DOS / Windows: Stderr

Оболочка DOS, command.com, не предлагает значит перенаправить stderr. Потому что что невозможно сохранить в файл или канал в программу, сообщения, которые программа печатает на STDERR. "foo> out" только перенаправляет стандартный вывод foo, а не stderr. Последний все еще идет к консоли.

Поскольку stderr, как правило, где важные сообщения об ошибках печатаются, это крайне неудачно, так как это делает нас неспособными обнаруживать ошибки в необслуживаемые работы.

Так что ты делаешь? Одним из решений является переключиться на Unix, где оболочка позволяет один для перенаправления stderr. С ш и его производные, используйте

foo >out 2>&1

чтобы сохранить как стандартный вывод, так и стандартный вывод foo выйти. Аналогично используйте

foo 2>&1 | bar

для передачи как stdout, так и stderr foo в бар. Если вы застряли в DOS, Stderr - это то, что вам нужно.

Stderr запускает команду и объединяет ее stderr в его стандартный вывод. Следовательно, перенаправление или передача трубопровода является эквивалентно делать то же самое, чтобы а также stderr.

Мне придется искать решения для Windows. PowerShell стал популярным, и, возможно, стоит попробовать.

1 голос
/ 19 ноября 2009

Ну, вы можете заменить 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, если хотите.

0 голосов
/ 18 ноября 2009

Сейчас на ум приходят два решения для фильтрации stdout / stderr в независимой консоли (но они не для двоичных потоков, следовательно, режим Community-Wiki):

  • Либо ничего не перенаправляйте (все выходы находятся в консоли), и используйте плагин, такой как Консоль Grep , чтобы выделить соответствующие выходы

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

  • И / или перенаправить все в файле, и использовать плагин, такой как NTail и использовать некоторые «Фильтр строк», чтобы исключить выбранные строки из отображения файла журнала (это может быть ближе к тому, что вы ищем).

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

(Вы можете определить множество представлений NTail, сколько вам нужно / нужно.)

...