System.out.print* および System.err.print* (Java で) への呼び出しを傍受し、それらにタイムスタンプを追加することは可能ですか? 心配する必要はありません。通常のログ フレームワークを使用していますが、時折 sys.out がリークすることがあります。それがいつ発生したかを把握しておくと、適切なログ ファイルに関連付けることができます。
3 に答える
あなたはそれを行うことができます。
「標準」出力ストリームを再割り当てします。まず、セキュリティ マネージャがある場合、その checkPermission メソッドが RuntimePermission("setIO") パーミッションで呼び出され、「標準」出力ストリームを再割り当てしてもよいかどうかが確認されます。
public class CustomPrintStream extends PrinterStream{
//override print methods here
}
System.setOut(new CustomPrintStream());
アスペクト指向プログラミングを使用してこれを実現できます-特に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);
}
次に、これをすべてアスペクトに入れ、コードに織り込む必要があります。オンラインには、その方法に関するチュートリアルがたくさんあります。
それは可能であるべきです。
System.out はprintStream です。
ストリームを拡張して日付と時刻を印刷メソッドに追加し、System.setOut()を使用してストリームを適切に設定できます。
print ステートメントがどこから来ているかを特定したい場合の補足として、次を使用できます。
Thread.currentThread().getStackTrace()[1].getClassName();