Где находится System.err в Windows? - PullRequest
3 голосов
/ 18 января 2010

У меня есть приложение на основе графического интерфейса Java, которое записывает некоторые диагностические сообщения в System.out и System.err. Где эти сообщения выводятся при работе в Windows? (Например, в Mac OS X они печатаются в журнал системной консоли.)

Редактировать

Я должен добавить, что приложение Java упаковано как .exe, поэтому (прямо сейчас) я не могу запустить его, используя java. (Полагаю, я могу скопировать отдельные файлы .JAR на тестовый компьютер Windows.)

Кроме того, это унаследованное мной приложение, которое раньше не использовало каркас журналирования; Я хотел бы изменить его, чтобы использовать один, но я надеялся быстро получить какой-нибудь вывод журнала для диагностики проблемы прямо сейчас.

Ответы [ 6 ]

6 голосов
/ 18 января 2010

Вы действительно можете изменить, где System.out и System.err указывают в вашем приложении, используя setout () и setErr () .

Так, например, если вы хотите сделать дамп в файл, вы можете сделать

System.setOut(new PrintStream("output.txt"));
System.setErr(new PrintStream("err.txt"));

Просто сделайте это один раз в main(String[] args) и вам будет хорошо идти.

3 голосов
/ 18 января 2010

AFAIK, если вы запускаете Java-приложение, используя java.exe, они записываются на консоль. Если вы запустите его, используя javaw.exe, они никуда не денутся, так как стандартный вход / выход / ошибка не перенаправляются для приложений с графическим интерфейсом. (Вы можете вручную создать подпроцесс для javaw.exe и перенаправить вывод, но это, я полагаю, выходит за рамки)

Я бы предложил вместо этого использовать некоторые каркасы ведения журналов и записывать сообщения в файл журнала. log4j или java.util.logging было бы хорошим началом ...

2 голосов
/ 18 января 2010

Приложения на основе графического интерфейса, запущенные с javaw при двойном щелчке по файлу .jar, не выведут System.out и System.err:

Загрузить файл java.util.logging.config.file для инициализации по умолчанию

«javaw» глотает весь вывод в System.out и System.err. Вместо этого попробуйте "java" (без "w").

2 голосов
/ 18 января 2010

Это действительно зависит от того, как вы запускаете приложение. Например, если бы вы запускали графический интерфейс из командной строки Windows (например, например java -jar myApp.jar), то, как и следовало ожидать, System.out и System.err будут переходить на консоль. Если вы запускаете с помощью самой оболочки Windows (например, двойной щелчок на исполняемом JAR-файле), то, насколько мне известно, эти потоки ошибок будут потеряны. Настройка выполнения приложения как службы (как бы маловероятно это ни звучало в вашей ситуации) также приведет к потере выходных потоков.

Использование стандарта в потоках put и output, как правило, не является хорошей идеей, если только вы не ожидаете, что ваша программа будет вызываться в среде типа shell-script, где это общие каналы связи. Как вы обнаружили, они обычно не очень хорошо определены в среде графического интерфейса. Если вы действительно хотите записывать текстовую информацию во время работы программы, рассмотрите возможность использования «реальной» среды ведения журналов (например, log4j или пакета java.util.logging) для записи сообщений в журнал.

1 голос
/ 18 января 2010

System.err сообщения печатаются на консоли, если вы запускаете свой класс из командной строки. если вы этого не сделаете, вы не увидите эти сообщения.

0 голосов
/ 18 января 2010

Вы могли бы использовать консоль Java , если бы она работала с Java.

...