2

java -jar私は、bash スクリプトを介して呼び出される小さな Java プログラムを持っています。プログラムは SOAP Web サービスを呼び出します。今後のトラブルシューティングのために、SOAP メッセージをファイルにキャプチャしたいと考えています。スタンドアロンの Java アプリでこれを行う唯一の方法は、これをクライアント クラスに追加することです。

static
{
    // Output the SOAP message to the console
    System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
    System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
}

これにより、SOAP メッセージがシステム アウトに出力されます。システム アウトをファイルにリダイレクトすることもできますが、コンソールに表示したい他のメッセージがシステム アウトに送信されます。これらのメッセージをファイルに含めても問題ありませんが、SOAP メッセージは多すぎてコンソールに表示できません。

コンソール出力である種の選択的なリダイレクトを行う方法はありますか?

4

3 に答える 3

1

キャプチャしたいメッセージをstderrに書き込み、それを適切にリダイレクトしてみませんか? 考慮すべき点の 1 つは、stdoutは [通常] バッファリングされ、stderrはバッファリングされないことです。

シェルのリダイレクトとパイピングを探しています。shell、bash、cshなどの標準的なシェルを使用していると仮定します...

  • command >foo.txtstdoutを fileにリダイレクト します。塗りつぶしの既存のコンテンツはすべて置き換えられます。foo.txt
  • command >>foo.txtstdoutをリダイレクト し、それを既存のコンテンツ (存在する場合)のファイルに追加します。foo.txtfoot.txt
  • foo | barcommandのコンテンツを commandのstdinにパイプします。foostdoutbar

*nix プロセスには、次の 3 つの標準 I/O ハンドルが開いています。

  • stdin標準入力です。ファイルハンドル0です。
  • stdout標準出力です。ファイルハンドル 1 です。
  • stderr標準エラーです。ファイルハンドル2です。

リダイレクトおよびパイプ オペレーターは、特定のファイル ハンドルをフックすることもできます。そう...

command >foo.txt 2>&1

次のことを行います。

  1. 標準出力をファイルにリダイレクトしますfoo.txt
  2. stderrをファイル ハンドル 1 のstderrにリダイレクトします。これは現在 として開かれていfoo.txtます。

他のシェルは、異なるが、一般的に類似した構文を使用できます (実際に使用します)。

いくつかの便利なコマンドについても学ぶ必要があります。

  • tee(1).

    これは、与えられた stdin を受け取り、それをコマンドラインで指定されたファイルと stdout に書き込むため、次のようなチェーンになります。

    some-command 2>&1 | tee some-command.log.2013-05-31.txt | less
    

    これはsome-commandおそらくかなりの量の出力を生成し、stderr を stdout にリダイレクトし、それを にパイプtee(1)してログファイルを生成し、それをsome-commmand.log.2013-05-31.txtパイプless(1)してコンソールにページングします。

  • less(1)

  • more(1)

    moreless(1)通常、これらの日の同義語です。これらはどちらも、出力をバッファリングして一度に 1 画面ずつ表示するページャであり、ページを前後に移動できます。

  • man(1)

  • apropos(1)

    これは *nix のオンライン ヘルプ システムです。それらについて詳しく知るには、次のコマンドを実行してみてください。

    * `man man`
    * `man apropos`
    

    およびコマンドのマニュアル ページを取得します。または、使用している特定のシェルについても試してみてください(たとえば、シェルのマニュアル ページが表示され、は Bourne シェル ( ) のマニュアル ページが表示され、マニュアル ページが表示されます。manaproposman teeman [your-shell-name]man cshcshman shshman bashbash

このページでは、C および Bourne シェル ファミリの通常のパイピング/リダイレクト演算子について説明します: http://www.mathinfo.u-picardie.fr/asch/f/MeCS/courseware/users/help/general/unix/redirection.html

Nutshell適切な O'Reillyの本も読む必要があります。

注: 以下のコメントで述べたように、次の行に沿ってSystem.OutandSystem.Errを独自のものに置き換えることができます。PrintStream

PrintStream originalStdOut = System.Out ;
PrintStream newStdout = CreateNewOutputSink() ;

System.Out.flush() ;
System.Out.setOut( newStdout ) ;

invokeSome3rdPartyCode() ;

System.Out.flush() ;
System.Out.setOut( originalStdout ) ;

これにより、通常の出力に影響を与えずに、サードパーティ ライブラリからの出力をフックして、選択したデータ シンクにリダイレクトできます。System.Out両方をフックして同じSystem.Errものにリダイレクトすると、プロセスで標準出力とエラー出力の両方がキャッチされます。 PrintStream

于 2013-05-31T18:44:37.790 に答える
0

SOAP コードが System.out.print を呼び出すため、アプリ内でこれを実行できる可能性は低いと思われます。

主な目的が SOAP からの出力から出力を分離することである場合は、メッセージの先頭に特別な記号を追加し、適切なスクリプトを介して出力をフィルター処理できます。

print ステートメントがコード全体に分散している場合は、AOP (つまり AspectJ) を使用して、この特別なシンボルを挿入するように変更することを検討できます。個人的には、必要に応じてすべてを 1 か所で変更できるように、独自のユーティリティ メソッドを使用してすべての印刷を行っています。

于 2013-06-04T07:30:59.613 に答える