12

かなり単純な問題のように思えますが、Scalatra のトップ レベルのエラー ハンドラーがトリガーされたときにスタック トレースをログに記録したいと考えています。次のような些細なことをして、メソッドの1つで意図的に例外をスローしています。

throw new IllegalArgumentException

エラー ハンドラでは、コードは次のようになります。

 error {
  case e => {
    val logger = LoggerFactory.getLogger(getClass)
    logger.info("an exception occurred: " + e.getStackTrace())
    logger.info("the request body is: " + request)
    NotFound("An error occurred, please contact support")
  }
}

エラー ハンドラー自体は Scalatra 固有のものですが、私が探している答えは、バニラの Scala 手法を使用して解決できると確信しています。この時点でスタックトレースを取得するためにできることはありますか? リクエストがエラー ハンドラと同じスレッド上にあるかどうかはわかりません。e.getStackTrace()私にくれます[Ljava.lang.StackTraceElement;@1f6b6954

ひどいコードのエラーを修正するためにログに記録して確認できるように、ここでスタック トレースを出力する最良の方法は何ですか?

4

4 に答える 4

7

Apache Commons Lang のExceptionUtilsを使用します。

import org.apache.commons.lang3.exception.ExceptionUtils
(...)
logger.info("an exception occurred: " + ExceptionUtils.getStackTrace(e))
于 2014-06-27T20:20:03.987 に答える
5

printStackTrace()ではなく欲しいと思いますgetStackTrace。ログファイルに出力している場合は、getMessage()役立つ場合があります。または、例外オブジェクト全体をロガーに渡してみてください。

于 2013-09-18T19:06:53.133 に答える
2

この質問には、例外スタック トレースを文字列に変換する方法がいくつかあります。ライターを提供しない限り、printStackTrace は System.err に出力します。

于 2013-09-18T19:09:47.487 に答える