2

ログに例外を反映させたいとします。

スタックトレースを例外に渡す必要がありますかlog.error()、それとも例外に渡す必要がありますtoString()か?それとももっと良いことをしますか?

ロガーに渡すスタックトレース文字列を取得するにはどうすればよいですか?

4

3 に答える 3

5

最新のロギング フレームワークはすべて、渡されたExceptionオブジェクトを特別に扱います。

log.error("Danger! High Voltage!", ex);

フレームワーク ( またはとする) は、スタック トレースを適切にフォーマットします。自分が何をしているのか本当にわからない限り、常に完全なスタック トレースをログに記録してください。それ以外の場合は、特定のロガーから常に例外を除外できます。

また、多くの重要な例外は意味のあるメッセージを提供しないことに注意してください。これNullPointerExceptionは重要な例です。

于 2012-04-11T11:59:06.637 に答える
1

もちろん、スタック トレース全体をログに記録します。この方法でソースを見つける方がはるかに簡単です。

ロギングに使用しているライブラリはわかりませんが、例外のロギングがサポートされていない場合は、次の方法でスタック トレースを文字列として取得できます。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
exception.printStackTrace(ps);
ps.close();
String stacktrace = baos.toString();
于 2012-04-11T11:57:57.083 に答える
0

log4jのようなものを使用する場合、例外用の追加パラメーターがあるため、通常は次のように記述します。

catch(Exception e){
    logger.error("some message", e);
}

Log4j がスタック トレースの出力を処理します。

(少なくとも log4j の場合) 留意すべき点の 1 つは、次のとおりです。

logger.error("", e);

いいえ

logger.error(e); // bad usage! This uses e.toString()!!
于 2012-04-11T12:00:10.420 に答える