私のプロジェクトで使用されているサードパーティのクローズドソースライブラリ(内部にカスタムロガーを含む)によって生成されたいくつかのログファイルを処理するために、小さなログアナライザアプリケーションを作成する必要があります。
ログ内の例外エントリの場合、スタックトレースに沿って、例外の先頭から実際の場所まで、関連するメソッドに関する集約情報を収集する必要があります。
残念ながら、デフォルトではJava printStackTrace()は呼び出しスタック内のすべてのメソッドを印刷せず、特定の番号まで印刷し、残りは16 more...
として参照されます。
自分で例外をキャッチできた場合、getStackTrace()を使用して自分で印刷しますが、このライブラリがスローする例外に根本原因が含まれることはありません。
尋ねる方法はありますかJavaスタックトレースでコールスタック全体を出力しますか?
私の状況とは別に、一般的なロギングフレームワークにはこのオプションがありますか?
編集:プログラムは、JDK 1.5.0_09を使用してSunのJVMで実行されます。それを変更するオプションはありません。
ここに説明があります 'caused by'および '...nmore'行の印刷されたトレース。 printStackTraceのJavaDoc も参照してください。何もする必要がないかもしれません。
文字「...」を含む行の存在に注意してください。これらの行は、この例外のスタックトレースの残りの部分が、この例外によって引き起こされた例外のスタックトレースの下部からの指定されたフレーム数と一致することを示します(「囲んでいる」例外)。この省略表現は、「原因の例外」がキャッチされたのと同じメソッドからラップされた例外がスローされる一般的なケースで、出力の長さを大幅に短縮できます。
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();
}
}
}