Перенаправить поток ошибок в файл и консоль в Windows - PullRequest
2 голосов
/ 27 мая 2011

Я хочу перенаправить поток ошибок из консольного приложения Java в файл и консоль.В обычной ситуации ошибка отображается только в консоли.Я хочу отображаться в консоли и файле.Как мне этого добиться?Когда я пишу:

java -classpath lib.jar com.hertz.test.Blad 2>error.log

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

Я работаю в Windows 2003 Server.

1 Ответ

3 голосов
/ 27 мая 2011

Это, конечно, простое упражнение для передачи выходных данных через фильтр, в данном случае это команда tee, которая выполняется в интерпретаторе команд Microsoft почти так же, как в TCC / LE от JP Software и (не-C-семейство оболочек) Оболочки Unix:

java -classpath lib.jar com.hertz.test.Blad 2>&1 | tee error-and-output.log

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

java -classpath lib.jar com.hertz.test.Blad 2>&1 1>con | tee error.log

Осталось только получить команду tee.Существует несколько возможностей:

  • Использовать порт команды Unix tee. Существует несколько вариантов.Чаще всего упоминаются GNUWin32 , cygwin и unxutils .Менее известны, но в некоторых отношениях лучше, инструменты из набора утилит SFUA , которые запускаются в подсистеме для приложений на основе UNIX , которая поставляется в комплекте с Windows7 Ultimate Edition и Windows Server 2008 R2.(Для Windows XP и Windows Server 2003 можно загрузить и установить Службы для UNIX версии 3.5 .) Этот инструментарий содержит большое количество инструментов TUI для командной строки, начиная с mvи du, через оболочки Корна и С, до perl и awk.Он выпускается в версиях x86-64 и IA64, а также x86-32.Программы работают в собственном POSIX-окружении Windows, а не с DLL-библиотеками эмулятора (такими как cygwin1.dll), наслоенными поверх Win32.И да, инструментарий имеет tee, а также около 300 других.
  • Используйте одну из множества собственных команд Win32 tee, которые люди написали и опубликовали. Одна из таких Ritchie Lawrence's MTEE, который, как вы можете видеть, имеет /D и /T опции для добавления меток времени и даты к каждой строке, которую он обрабатывает.
  • Используйтезаменяющий интерпретатор команд, который поставляется со встроенной командой TEE. JP Software TCC / LE является одним из таких.TCC / LE имеет встроенную TEE команду .Как видите, у него также есть опции /D и /T для добавления меток времени и даты к каждой обрабатываемой строке.

В качестве отступления: для вашего приложения лучше добавить датуи сами отметки времени, чем для последующей обработки командой TEE.По нескольким причинам, связанным как с тем, как приложения ведут себя, когда их стандартные потоки являются каналами, так и с тем, как работают каналы, каждая строка вывода не обязательно будет обрабатываться TEE в тот момент, когда ваше приложение сначала ее сгенерировало.Эта свобода повлияет как на относительную (по отношению друг к другу), так и на абсолютную (по отношению к настенным часам) точность отметок времени, которые вы видите.

...