Javaでスタックトレースを文字列に変換する
1. 前書き
Javaで例外を処理するとき、スタックトレースをログに記録したり、単に表示したりすることがよくあります。 ただし、スタックトレースを出力するだけではなく、スタックトレースをファイルやデータベースに書き込んだり、ネットワーク経由で送信したりする必要がある場合もあります。
これらの目的のために、Stringとしてスタックトレースを持つことは非常に便利です。 残念ながら、Javaはそれを直接行うための非常に便利な方法を提供していません。
2. コアJavaによる変換
コアライブラリから始めましょう。
Exceptionクラスの関数printStackTrace()は、PrintStreamまたはPrintWriterのいずれかの1つのパラメーターを取ることができます。 したがって、StringWriterを使用して、スタックトレースをStringに出力することができます。
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
次に、sw.toString()を呼び出すと、スタックトレースがStringとして返されます。
3. Commons-Langによる変換
前の方法は、コアJavaを使用してスタックトレースをStringに変換する最も簡単な方法ですが、少し面倒なままです。 幸い、Apache Commons-Langはその仕事をする関数を提供します。
Apache Commons-Langは、例外を処理するために使用できるクラスなど、Java APIのコアクラスにはない多くの機能を提供する非常に便利なライブラリです。
まず、プロジェクトの構成から始めましょう。 Mavenを使用する場合は、pom.xmlに次の依存関係を追加する必要があります。
org.apache.commons
commons-lang3
3.5
次に、この場合、最も興味深いクラスはExceptionUtilsです。これは、例外を操作する関数を提供します。 このクラスを使用すると、スタックトレースをExceptionからStringとして取得するのは非常に簡単です。
String stacktrace = ExceptionUtils.getStackTrace(e);
4. 結論
例外のスタックトレースをStringとして取得することは難しくありませんが、直感的とは言えません。 この記事では、コアJavaを使用するか、Apache Commons-Langを使用するかの2つの方法を紹介します。
Java 9は新しいStackWalking APIをもたらすので、作業が簡単になることに注意してください。
いつものように、コードサンプルはhere on GitHubで見つけることができます。