ログに例外を反映させたいとします。
スタックトレースを例外に渡す必要がありますかlog.error()
、それとも例外に渡す必要がありますtoString()
か?それとももっと良いことをしますか?
ロガーに渡すスタックトレース文字列を取得するにはどうすればよいですか?
最新のロギング フレームワークはすべて、渡されたException
オブジェクトを特別に扱います。
log.error("Danger! High Voltage!", ex);
フレームワーク ( logbackまたはlog4jとする) は、スタック トレースを適切にフォーマットします。自分が何をしているのか本当にわからない限り、常に完全なスタック トレースをログに記録してください。それ以外の場合は、特定のロガーから常に例外を除外できます。
また、多くの重要な例外は意味のあるメッセージを提供しないことに注意してください。これNullPointerException
は重要な例です。
もちろん、スタック トレース全体をログに記録します。この方法でソースを見つける方がはるかに簡単です。
ロギングに使用しているライブラリはわかりませんが、例外のロギングがサポートされていない場合は、次の方法でスタック トレースを文字列として取得できます。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
exception.printStackTrace(ps);
ps.close();
String stacktrace = baos.toString();
log4jのようなものを使用する場合、例外用の追加パラメーターがあるため、通常は次のように記述します。
catch(Exception e){
logger.error("some message", e);
}
Log4j がスタック トレースの出力を処理します。
(少なくとも log4j の場合) 留意すべき点の 1 つは、次のとおりです。
logger.error("", e);
いいえ
logger.error(e); // bad usage! This uses e.toString()!!