1

現在、小さな Windows バッチ コンソールの出力をログ ファイルにリダイレクトする際に問題が発生しています。私の Java アプリケーションは、終了を待たずに Runtime.exec() 呼び出しを開始し、出力をログに記録する必要があります。ここに私のロガークラスがあります:

public class BatchThreadLogger extends Thread {
  private Process process;
  private String logFilePath;
  private static final Logger logger = Logger.getLogger(BatchThreadLogger.class);

  public BatchThreadLogger(Process process, String logFilePath) {
    this.process = process;
    this.logFilePath = logFilePath;
  }

  public void run() {
    try {
      // create logging file
      File file = new File(logFilePath);
      file.createNewFile();

      // create a writer object
      OutputStream os = new FileOutputStream(file);
      PrintWriter pw = new PrintWriter(os);

      // catch the process output in an InputStream
      InputStreamReader isr = new InputStreamReader(process.getInputStream());
      BufferedReader br = new BufferedReader(isr);

      // wait for the process to complete
      int processStatus = process.waitFor();

      // redirect the output to the log file
      String line = null;
      while ((line = br.readLine()) != null) {
        pw.println(line);
      }

      // add a small message with the return code to the log
      pw.println("********************************************");
      pw.println("********************************************");
      pw.println("Batch call completed with return status " + processStatus);

      pw.flush();
      os.close();
    }
    catch (IOException e) {
      logger.error("IOException raised during batch logging on file " + logFilePath, e);
    }
    catch (InterruptedException e) {
      logger.error("InterruptedException raised during batch process execution", e);
    }
  }
}

私の呼び出しは非常に簡単です:

Process process = Runtime.getRuntime().exec(command);
BatchThreadLogger logger = new BatchThreadLogger(process, logFilePath);
logger.start();

私のコマンドは現在、2 つのパラメーターを指定して test.bat を呼び出しているだけです。私のテストバッチは次のようになりました:

echo "BATCH CALLED WITH PARAMETER %1 AND %2"
exit

ただし、ログファイルには次のもののみが含まれます:

********************************************
********************************************
Batch call completed with return status 0

waitFor()出力をログ ファイルにリダイレクトするコードの前後に呼び出しを配置し​​ようとしましたが、成功しませんでした。起動中のコマンドの黒い画面が常に表示されますが、ログには何もありません...

私は何かが欠けていますが、何が理解できません...

4

1 に答える 1

1

作成したプロセスの標準エラーから読み取っていません。

エラーメッセージが標準エラーに書き込まれていると思われます.標準出力から読み取っているだけなので、このエラーを検出していません.

次のようなものを使用して、の使用を ProcessBuilder にRuntime.getRuntime().exec(...)置き換えることをお勧めします。

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "test.bat", "One", "Two");
pb.redirectErrorStream(true);
Process process = pb.start();

この行pb.redirectErrorStream(true);はプロセスの標準エラーを標準出力にリダイレクトするので、2 つの別々のスレッドで 2 つのストリーム (標準出力と標準エラー) から読み取る必要はありません。

于 2012-06-05T11:01:25.967 に答える