メソッドがstderrを生成するときに、STDERRに情報を追加するにはどうすればよいですか?
質問
メソッドがSTDERRへの書き込みを生成するときにキャッチできる方法はありますか? STDERRの書き込みごとに情報を前に追加しようとしています。
メソッドは次のとおりです:
parser.thatGeneratesSTDERR();
次のように生成されます
行37:29文字「a」で実行可能な代替はありません
標準エラーをキャッチして何かを前に追加するものでラップすることができます 情報なので、代わりに次のようになります。
ファイル:mybadfile.txt-行37:29文字「a」で実行可能な代替はありません
おそらく、STDERRの書き込みを行う実際のコードを掘り下げることができると思いますが、私はそれをやりたくありません-代わりにこのメソッドの周りにいくつかのコードをラップするだけです。
このメソッドは常にSTDERRを生成するわけではないことに注意してください-キャッチしようとしている理由は、STDERRを生成しないことです-これはかなりの数のファイル( 40)どのファイルがエラーメッセージを生成しているのかわかりません。見つけるまでに時間がかかります。
更新 だから、STDERRを変更できます-新しいSTDERRでprintlnをオーバーライドする必要があることを忘れていました...関連するコードは次のとおりです。
public static String errfile = "";
static {
final PrintStream currentErr = System.err;
PrintStream newErr = new PrintStream(currentErr)
{
public void println(String string) {
print("File: " + errfile + " --");
print(string);
super.println();
}
};
System.setErr(newErr);
}
テストする各ファイルについて、errfileをファイル名に変更するだけで、出力が期待通りになります...
どうもありがとう!
解決
System.setErrの動作を考えると、これが機能するかどうかはわかりません。
印刷ストリームを拡張し、メソッドを上書きしてコメントを追加する新しいクラスを作成します。次に、エラーストリームを新しいprintstreamに設定します。この新しいクラスからSystem.err.printxxxを呼び出さないでください。
ex ...
class PrependPrintStream extends PrintStream {
PrependPrintStream(PrintStream ps, String pre){...}
...
public void print(boolean b) {
super.print(this.pre);
super.print(b);
}
...
sunのPrintStream implを調べたところ、すべてのprintxxxが、protectedではなくprivateであるwrite(String)に委任されているようです。コードをコピー/ペーストできると思います。
編集::
より良い解決策は、System.errの代わりにLoggingを使用することです。これにより、ステートメントのオンとオフを切り替えたり、カスタムエラーハンドラーを作成したりできます。特定のハンドラーは、System.errに出力する前に、文字列に希望するステートメントを追加できます。これには、特定のロガーを使用するステートメントのみが追加されたテキストを持ち、System.errへの他の呼び出しにはないという利点もあります。
他のヒント
おそらく、アスペクト指向プログラミング(AOP)を見たいと思うでしょう。 AOPを使用すると、呼び出しているパーサーへのプロキシを作成できます。メソッドがthatGeneratesSTDERR()を呼び出す前に、呼び出すことができます。呼び出しから、必要な情報を出力できます。
AOPの仕組みを理解するには、少し読む必要があることに注意してください。
AspectJ- http://www.eclipse.org/aspectj/
AOP Alliance- http://sourceforge.net/projects/aopalliance
System.setErr を使用して、stderrを独自のPrintStreamにリダイレクトします。