2009-05-28 7 views
10

Javaアプリケーションを実行するバッチファイルがあります。私は、例外が発生するたびにSTDERRをファイルに書き出すように修正しようとしています。私もlog.txtファイルに引数%1と%2を書くことができる方法はありバッチ標準エラーをファイルにリダイレクト

start java something.jar method %1 %2 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... 

答えて

0

次のようなもの(未テスト)について、どのように:

@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

しかし、バッチファイルが呼び出されるたびに出力がログに記録されるでしょうか?私は可能な場合はそれを避けたいと思うし、Javaアプリケーションが例外をスローする場合は、単にログを持っている。 – nivlam

2

私はあなたが求めているかを正確に取得するが、ここではいくつかありますしません。あなたが助けてくれる情報...

stderrをstdoutとは別に.cmdまたは.batファイルにリダイレクトすることができます。

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

その後、あなたはコンテンツのcommand.stderr.txtを確認することができ、かつ任意のが存在する場合、ログファイルにcommand.stdout.txtにそれを連結します。標準エラー出力をリダイレクトするには、このようなものを使用。あるいは、どのような場合でもそれを連結することができます。あなたが好きなら、実行したコマンドを最後のログファイルにエコーすることもできます。

%ERRORLEVEL%env varを使用して、バッチファイル内の終了コードを確認することもできます。 Exeファイルは、エラーが発生した場合にERRORLEVELを設定すると予想されます。 java.exeがこれを行うかどうかはわかりません。それがWindows上の良い市民であれば、それはすべきです。これは、Javaアプリがエラー状態で終了したかどうかを調べる代替方法です。しかし、これはstderrが何も持っていないという保証ではありません。たとえば、Javaアプリケーションは例外とスタックトレースを出力し、成功を示すコード0で終了することがあります。この場合、stderrには塊がありますが、ERRORLEVELはゼロになります。

EDIT:S/ERROR_LEVEL/ERRORLEVEL

+0

私はこのバッチファイルが呼び出されるたびにファイルに書き込むことを避けようとしています。このバッチファイルは非常に頻繁に呼び出され、すでに飽和しているIOサーバー上に存在します。 – nivlam

+0

あなたの答えをちょっと読んでください。私はすでにstderrをログファイルに書き出していますが、バッチファイルにも渡されたパラメータを書き出してみたいと思います。これらのパラメータは、stderrをログに書き込むときにのみログに記録します。 – nivlam

+0

%ERRORLEVEL%ではなく、%ERROR_LEVEL%と呼ばれています。さらに、実際には存在しない%errorlevel%と比較しないで "if errorlevel 1 ..."でチェックする必要があります。 – Joey

0

を使用してみてください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

私はこれを試しましたが、javaが例外をスローした場合でもerrorlevelは常にゼロです。 – nivlam

+0

javaメインクラスがあなたによって書かれている場合は、try/catchですべてのものをラップし、catchブロックでexit(1)を使用して環境内のエラーレベルを設定することができます –

2
私は一時ファイルに標準エラー出力をリダイレクトすることです参照

ザ・唯一の作業溶液

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 
) 

バッチが順番に実行されるのではなく、同時にあなたは一時変数をuniquifyために何かを見つける必要がある場合:

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 
) 

これは、複数の実行中のバッチ間の衝突を避けることができます。しかし、あなたは現在、ログファイルへの書き込みをロックするために何も使用しておらず、他のものが書き込まれると状況が変わることがあります(echotypeコマンドでインターリーブするかもしれない他のバッチや、あなたが混入バッチ出力を避けるために、ログに書き込むためのセマフォなどの別のファイルを使用することができます

 
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 

:そのファイルへのJavaの出力だけでなく、それはJavaプログラムの定期的な出力と混ざっことがあります。ログに書き込むときにファイルを作成し、後でそれを削除してから作成しようとすると、実際にそこにいるかどうかをチェックし、消えるまで待ってください。そのただし、stdoutの一時ファイルのアプローチを使用する点を除いて(単にtype stdoutのログをlog.txtに、Javaプログラムが終了した時点で、セマフォを再び使用しています)。

0

このようなバッチファイルは、このトリックを行う必要があります。

は、ここで私は、パイプ経由で標準エラー出力を渡すと、引数として引数を渡している

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 

をstart_prog.cmd。出力はlog.txtファイルに追加されます。

捨てるスクリプトに標準エラー出力をフォーマットし、そして引数として引数を渡す

2>&1 

パイプをstdoutにSTDOUT

1>nul 

リダイレクト標準エラー。

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

"log.txtという"に出力を追加します。

>>log.txt 

私のシステムでは、python.exeを呼び出す必要があります。そうしないと、パイプは機能しません。ここで

は、私が "something.py"と"format_output.py" を使用し2つのファイルがあります。

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 

そしてfinalyここで出力です。

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

不足している唯一のもの

log.txtとは何かが常に"のlog.txt"ファイルに書き込まれていることです。

これをさらに整理するために、ログファイルを「format_output.py」に書き込んでください。

次に、プログラムの標準エラーが空白であるかどうかをチェックすることができます。このような

+0

本当に間違っていない限り、 * 2>&1 1>ヌル**。あなたはNULにすべての出力を送り、パイプをPythonにジャンプさせることはありません。私は悲しいことにそれを試すことはできないのですか? – Jay

3

何かがうまくいくかもしれない:

を私はJavaプログラマ自身ないです

@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 
) 

をjavastart.cmd、私はこの出力/状況をテストすることはできませんが:

1:%*は、すべてのパラメータを意味します(フォーマットは何でも) ing。それらを区切るよりもこれを使う方が良いかもしれません。悪いスペーシング/引用の場合でも、完全なパラメタがあります。ログに行を追加して、完全な行を表示してからパラメータを表示しました。悪い議論の問題であれば、どこに問題があるかを見ることができます。 部分だけでしょうかであるものは何でも:

2:のみ

電子%% に設定し、標準エラー出力を維持します(^> NUL)nullに標準出力を送信実際にはのテストステートメントには何も出力がありません。すなわち、%% eが設定されています。

これらが言われているように、スクリプトをテストして、実際にエラーが発生しても例外がstderrに送信されるか、または他のソフトウェアと同様にstdoutに送信されます。

こちらがお役に立てば幸いです。

関連する問題