printStackTrace()で完全な呼び出しスタックを印刷しますか?
-
20-08-2019 - |
質問
プロジェクトで使用されるサードパーティのクローズドソースライブラリ(内部にカスタムロガーを含む)によって生成されたいくつかのログファイルを処理する小さなログアナライザアプリケーションを作成する必要があります。
ログの例外エントリの場合、スタックトレースに沿って、例外の先頭から実際の場所までに含まれるメソッドに関する集約情報を収集する必要があります。
残念ながら、デフォルトでは、Java printStackTrace()は呼び出しスタック内のすべてのメソッドを印刷せず、特定の数まで印刷し、残りは16 more...
として参照されます。
自分で例外をキャッチできた場合、getStackTrace()を使用して自分で印刷しますが、このライブラリがスローする例外に根本原因が含まれることはありません。
スタックトレースでコールスタック全体を印刷するようJavaに要求する方法はありますか?
私の状況とは別に、一般的なロギングフレームワークにはこのオプションがありますか?
編集:プログラムは、JDK 1.5.0_09を搭載したSunのJVMで実行されます。それを変更するオプションはありません。
解決
ここに説明があります印刷されたトレースの 'および' ... n 個以上の行。 printStackTraceのJavaDocも参照してください。 。作業する必要がない場合があります。
<!> quot; ... <!> quot;という文字を含む行が存在することに注意してください。これらの行は、この例外のスタックトレースの残りが、この例外(<!> quot; enclosing <!> quot;例外)によって引き起こされた例外のスタックトレースの下部から示されたフレーム数と一致することを示しています。この速記は、ラップされた例外が<!> quot; causative exception <!> quot;と同じメソッドからスローされる一般的なケースで、出力の長さを大幅に短縮できます。キャッチされます。
他のヒント
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();
}
}
}
:によって返された配列を反復しようとすることができますか
Thread.currentThread().getStackTrace();