Пакет перенаправления stderr в файл

У меня есть пакетный файл, который выполняет JAVA-приложение. Я пытаюсь изменить его так, чтобы каждый раз, когда исключение происходит, оно выписало STDERR в файл.

Это выглядит примерно так:

start java something.jar method %1 %2 2>> log.txt

Существует ли способ, которым я могу записать аргументы %1 и %2 в файл log.txt также? Я не хочу писать это в файл журнала каждый раз, этот пакетный файл называют, только когда исключение происходит.

Я пытался искать способ перенаправить STDERR в переменную, но я не мог понять это. Идеально я хотел бы, чтобы файл журнала посмотрел что-то как:

Batch file called with parameters:
- "first arg"
- "second arg"
Exception: 
java.io.exception etc...

------------------------------------

Batch file called with parameters:
- "first arg"
- "second arg"
Exception: 
java.io.exception etc...
10
задан wes 22 August 2012 в 19:59
поделиться

6 ответов

Единственное рабочее решение, которое я вижу, - перенаправить stderr во временный файл

java blah.jar %1 %2 2>stderr

, а затем проверка, было ли что-то записано в файл, и запись в журнал в этом случае.

for %%i in (stderr) do if %%~zi GTR 0 (
    echo Parameters: %1 %2 >>log.txt
    type stderr >> log.txt
)

Если пакеты запускаются не последовательно, а одновременно, вам нужно найти что-то для уникальной временной переменной:

set file=%time::=%
set /a file=file
set file=%file%%random%
java blah.jar %1 %2 2>stderr_%file%
for %%i in (stderr) do if %%~zi GTR 0 (
    echo Parameters: %1 %2 >>log.txt
    type stderr >> log.txt
)

Это позволит избежать конфликтов между несколькими запущенными пакетами. Однако в настоящее время вы ничего не используете для блокировки записи в файл журнала, и что-то может показаться неуместным, когда в него записываются другие данные (с другими пакетами вы можете получить чередование в echo и введите команды или, если вы также перенаправляете вывод java в этот файл, тогда он может смешаться с обычным выводом программы java:

Parameters: foo bar
Some regular output
Parameters: foo2 bar2
More output
NullPointerException at Blah: What we really wanted to have right after the parameters
IOException at Blah: This exception belongs to the parameters foo2 bar2

Вы можете использовать другой файл в качестве семафора для записи в журнал, чтобы избежать смешивания пакетных выводов: создайте файл [ copy nul file ], если вы хотите записать в журнал, удалите его после этого и перед попыткой его создания проверьте, есть ли он на самом деле, и подождите, пока он не исчезнет. Однако вы не можете ничего сделать с журналом стандартного вывода, добавленным к файлу, за исключением того, что вы также используете этот подход с временным файлом и для стандартного вывода (и просто введите журнал стандартного вывода в log.txt , когда программа Java завершилась, но снова с использованием семафора.

создайте файл [ copy nul file ], когда вы хотите записать в журнал, удалите его после этого и, прежде чем пытаться создать, проверьте, есть ли он на самом деле, и подождите, пока он не исчезнет. Однако вы не можете ничего сделать с журналом стандартного вывода, добавленным к файлу, за исключением того, что вы также используете этот подход с временным файлом и для стандартного вывода (и просто введите журнал стандартного вывода в log.txt , когда программа Java завершилась, но снова с использованием семафора.

создайте файл [ copy nul file ], когда вы хотите записать в журнал, удалите его после этого и, прежде чем пытаться создать, проверьте, есть ли он на самом деле, и подождите, пока он не исчезнет. Однако вы не можете ничего сделать с журналом стандартного вывода, добавленным к файлу, за исключением того, что вы также используете этот подход с временным файлом и для стандартного вывода (и просто введите журнал стандартного вывода в log.txt , когда программа Java завершилась, но снова с использованием семафора.

2
ответ дан 4 December 2019 в 02:52
поделиться

Я не совсем понимаю, что вы спрашиваете, но вот некоторая информация, которая может помочь ...

Вы можете перенаправить stderr отдельно от stdout в файле .cmd или .bat. Чтобы перенаправить stderr, используйте что-то вроде этого:

MyCommand.exe > command.stdout.txt  2> command.stderr.txt

Затем вы можете проверить содержимое command.stderr.txt и, если оно есть, объединить его с command.stdout.txt в свой файл журнала. Или вы можете в любом случае объединить его. Если хотите, вы также можете повторить команду, которую вы выполнили, в окончательный файл журнала.

Вы также можете проверить код выхода в пакетном файле, используя% ERRORLEVEL% env var. Ожидается, что в exe-файлах будет установлено значение ERRORLEVEL в случае ошибки. Я не знаю, делает ли это java.exe. Должен, если он хороший гражданин на винде. Это может быть альтернативный способ узнать, завершилось ли приложение Java с ошибкой. Но это не гарантия того, что stderr ничего не получил. Например, приложение Java может распечатать исключение и трассировку стека, а затем выйти с кодом 0, что означает успех. В этом случае в stderr будет мусор, но ERRORLEVEL будет равен нулю.

EDIT : s / ERROR_LEVEL / ERRORLEVEL

2
ответ дан 4 December 2019 в 02:52
поделиться

Как насчет чего-то вроде этого (непроверено):

@echo off
@echo Batch file called with parameters: >> log.txt
@echo - %1 >> log.txt
@echo - %2 >> log.txt
start java something.jar method %1 %2 2>> log.txt
0
ответ дан 4 December 2019 в 02:52
поделиться

Попробуйте использовать ERRORLEVEL

java something.jar method %1 %2 2>> log.txt
IF %ERRORLEVEL% NEQ 0 GOTO Error

Error:
@ECHO There was an error
@ECHO Arg 1: %1 >> log.txt
@ECHO Arg 2: %2 >> log.txt
0
ответ дан 4 December 2019 в 02:52
поделиться

Такой командный файл должен помочь.

start_prog.cmd

CALL :Start_Prog arg1 arg2
GOTO :EOF

:Start_Prog
    something.py %1 %2 2>&1 1>nul | "C:\Python26\python.exe" format_output.py %1 %2 >>log.txt
    GOTO :EOF

Здесь я передаю stderr через конвейер и передаю аргументы в качестве аргументов. Затем вывод добавляется в файл log.txt.

Выбрасывать stdout

1>nul

Перенаправить stderr на stdout

2>&1

Транслировать stderr в сценарий для форматирования вывода и передавать аргументы в качестве аргументов.

| "C:\Python26\python.exe" format_output.py %1 %2

Добавить вывод в "log.txt" .

>>log.txt

В моей системе мне нужно вызвать python.exe, иначе канал не будет работать.

Вот два файла, которые я использовал "кое-что .py " и " format_output.py ".

something.py

import sys
print >>sys.stdout, " ".join(sys.argv[1:])
print >>sys.stderr, "java.io.exception etc..."

format_output.py

import sys

print "Batch file called with parameters:"
for arg in sys.argv[1:]:
    print '- "{0}"'.format(arg)

print "Exception:"
for line in sys.stdin:
    print line

И, наконец, вот результат.

log.txt

Batch file called with parameters:
- "arg1"
- "arg2"
Exception:
java.io.exception etc...

не хватает только того, что что-то всегда записывается в файл "log.txt" .

0
ответ дан 4 December 2019 в 02:52
поделиться

Что-то вроде этого может сработать:

javastart.cmd

@echo off
set params=%*
for /f "delims=" %%e in ('java something.jar method %1 %2 ^>nul') do (
    echo Batch file called with parameters:>>log.txt
    echo - Args[]: %*>>log.txt
    echo - Arg[1]: %1>>log.txt
    echo - Arg[2]: %2>>log.txt
    echo Exception: %%e
)

Я сам не программист на java, я не могу проверить этот вывод / Ситуация, но:

1: % * означает все параметры, от 1-го до последнего (даже% 12, хотя он не доступен напрямую ..) независимо от форматирования. Возможно, лучше использовать это, чем ограничивать их. Даже с плохим интервалом / цитированием у вас также будут полные параметры. Я добавил строку в журнал, чтобы показать всю строку, затем параметры. Вы можете увидеть, где была проблема, если дело в неверных аргументах.

2: отправка stdout в null (^> nul) сохранит только вывод stderr, установленный в %% e

3: Все, что находится в части do , будет происходить только в тестовом операторе for , на самом деле есть что-нибудь в качестве вывода, то есть if %% e установлен.

С учетом сказанного вы должны протестировать сценарий и посмотреть, действительно ли исключение отправлено на stderr или, как некоторые другие программы, на stdout, даже если произошла ошибка.

Надеюсь, это поможет.

установлен в %% e

3: Все, что указано в части do , будет происходить только в том случае, если тестовый оператор for фактически имеет что-нибудь в качестве вывода, т.е. если установлено %% e .

С учетом сказанного вы должны протестировать сценарий и посмотреть, действительно ли исключение отправлено на stderr или, как некоторые другие программы, на stdout, даже если произошла ошибка.

Надеюсь, это поможет.

установлен в %% e

3: Все, что указано в части do , будет происходить только в том случае, если тестовый оператор for фактически имеет что-нибудь в качестве вывода, т.е. если установлено %% e .

С учетом сказанного вы должны протестировать сценарий и посмотреть, действительно ли исключение отправлено на stderr или, как некоторые другие программы, на stdout, даже если произошла ошибка.

Надеюсь, это поможет.

3
ответ дан 4 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: