48

私のプロジェクトで使用されているサードパーティのクローズド ソース ライブラリ (内部にカスタム ロガーがある) によって生成されたいくつかのログ ファイルを処理するために、小さなログ アナライザー アプリケーションを作成する必要があります。

ログに例外エントリがある場合は、スタック トレースに沿って、トップから実際の例外の場所まで、関連するメソッドに関する集約情報を収集する必要があります。

残念ながら、デフォルトでは、Java printStackTrace() はコール スタック内のすべてのメソッドを出力するわけではありませんが、特定の数までは出力し、残りは単に として参照され16 more...ます。

自分で例外をキャッチできる場合は、getStackTrace() を使用して自分で出力しますが、このライブラリがスローする例外には根本的な原因が含まれていません。

スタックトレースにコールスタック全体を出力するようJavaに依頼する方法はありますか?

私の状況とは別に、一般的なロギング フレームワークにはこのオプションがありますか?

編集:プログラムは、Sun の JVM と JDK 1.5.0_09 で実行されます。それを変更するオプションはありません。

4

3 に答える 3

32

印刷されたトレースの「caused by」行と「... n more」行の説明を次に示します。printStackTrace のJavaDocも参照してください。する仕事がないかもしれません。

文字「...」を含む行の存在に注意してください。これらの行は、この例外の残りのスタック トレースが、この例外 (「囲んでいる」例外) によって引き起こされた例外のスタック トレースの下部から指定された数のフレームと一致することを示しています。この短縮形は、「原因となる例外」がキャッチされるのと同じメソッドからラップされた例外がスローされる一般的なケースで、出力の長さを大幅に短縮できます。

于 2009-06-25T11:47:36.623 に答える
7

で何とかできないのThread.currentThread().getStackTrace()

メソッドを再帰的に 20 回呼び出してから、現在のスレッドのスタックをダンプする、本当に簡単な例を次に示します。

public class Test {
    public static void main(String[] args) {
        method();
    }

    static int x = 0;
    private static void method() {
        if(x>20) {
            StackTraceElement[] elements = Thread.currentThread().getStackTrace();

            for(int i=0; i<elements.length; i++) {
                System.out.println(elements[i]);
            }
        }
        else {
            x++;
            method();
        }
    }
}
于 2009-06-25T11:42:17.350 に答える
-1

によって返された配列を反復処理することができます:

Thread.currentThread().getStackTrace();
于 2009-06-25T11:44:42.883 に答える