6

System.out.print* および System.err.print* (Java で) への呼び出しを傍受し、それらにタイムスタンプを追加することは可能ですか? 心配する必要はありません。通常のログ フレームワークを使用していますが、時折 sys.out がリークすることがあります。それがいつ発生したかを把握しておくと、適切なログ ファイルに関連付けることができます。

4

3 に答える 3

10

あなたはそれを行うことができます。

ドキュメントを見る

「標準」出力ストリームを再割り当てします。まず、セキュリティ マネージャがある場合、その checkPermission メソッドが RuntimePermission("setIO") パーミッションで呼び出され、「標準」出力ストリームを再割り当てしてもよいかどうかが確認されます。

public class  CustomPrintStream extends PrinterStream{

 //override  print  methods here 
}

System.setOut(new CustomPrintStream());
于 2013-06-22T05:44:14.697 に答える
2

アスペクト指向プログラミングを使用してこれを実現できます-特にAspectJツール。

コード内のポイントで一致するポイントカットを定義し、それらのポイントで実行されるアドバイスを作成するという考え方です。AspectJ コンパイラは、それらのポイントでアドバイスを織り込みます

printしたがって、問題については、最初に、メソッドを呼び出すたびに取得されるポイントカットを定義しますPrintStream

pointcut callPrint(PrintStream ps, String s) : 
              call(* java.io.PrintStream.print*(..)) && target(ps) && args(s);

次に、この呼び出しを回避して引数が である場合に置換するアドバイスを記述しPrintStreamますSystem.out( System.err.

void around(PrintStream ps, String s) : callPrint(ps,s) {
  if(ps.equals(System.out)){
    String new_string = ...
    proceed(new_string);
  }
  else proceed(s);
}

次に、これをすべてアスペクトに入れ、コードに織り込む必要があります。オンラインには、その方法に関するチュートリアルがたくさんあります。

于 2013-06-22T07:23:52.647 に答える
2

それは可能であるべきです。

System.out はprintStream です

ストリームを拡張して日付と時刻を印刷メソッドに追加し、System.setOut()を使用してストリームを適切に設定できます。

print ステートメントがどこから来ているかを特定したい場合の補足として、次を使用できます。 Thread.currentThread().getStackTrace()[1].getClassName();

于 2013-06-22T05:44:42.853 に答える