web-dev-qa-db-ja.com

printStackTrace()で完全な呼び出しスタックを印刷しますか?

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

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

残念ながら、デフォルトではJava printStackTrace()は呼び出しスタック内のすべてのメソッドを印刷せず、特定の番号まで印刷し、残りは16 more...として参照されます。

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

尋ねる方法はありますかJavaスタックトレースでコールスタック全体を出力しますか?

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

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

42
akarnokd

ここに説明があります 'caused by'および '...nmore'行の印刷されたトレース。 printStackTraceのJavaDoc も参照してください。何もする必要がないかもしれません。

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

29
akf

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();
        }
    }
}
5
A_M