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