6

System.out.println を呼び出しているライブラリがいくつかあります。log4j または commons ロギングを介してそれらをリダイレクトしたいと思います。しかし、特に、どのコンポーネントがログを生成したかがわかるように、完全修飾クラス名を保持したいと思います。

これを達成するための整然とした方法はありますか?


更新: これを達成した後、ここにコードを投稿しました:
http://www.bukisa.com/articles/487009_java-how-to-redirect-stderr-and-stdout-to-commons-logging-with-the-calling-class

4

2 に答える 2

18

私が考えることができる唯一の方法は、クラス名を解決するためにPrintStream、メソッドが呼び出されたときにスタック トレースを作成する独自の実装を作成することです。printlnそれはかなり恐ろしいことですが、うまくいくはずです...概念のサンプルコードの証明:

import java.io.*;

class TracingPrintStream extends PrintStream {
  public TracingPrintStream(PrintStream original) {
    super(original);
  }

  // You'd want to override other methods too, of course.
  @Override
  public void println(String line) {
    StackTraceElement[] stack = Thread.currentThread().getStackTrace();
    // Element 0 is getStackTrace
    // Element 1 is println
    // Element 2 is the caller
    StackTraceElement caller = stack[2];
    super.println(caller.getClassName() + ": " + line);
  }
}

public class Test {
  public static void main(String[] args) throws Exception {
    System.setOut(new TracingPrintStream(System.out));
    System.out.println("Sample line");
  }
}

(コードでは、もちろん代わりにlog4jにログを記録するようにします...またはおそらく同様です。)

于 2011-04-19T07:15:00.653 に答える
1

ソース コードを変更できる場合は、Eclipse プラグイン Log4Eを参照してください。System.out.println を logger ステートメント (およびロギングを扱う他の多くのクールなもの) に変換する関数を提供します。

于 2011-04-19T07:06:50.363 に答える