入力されたメッセージと例外のスタック トレースの両方をログに記録する正しい方法は何ですか?
logger.error(
"\ncontext info one two three: {} {} {}\n",
new Object[] {"1", "2", "3"},
new Exception("something went wrong"));
次のような出力を生成したいと思います。
context info one two three: 1 2 3
java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...
私の SLF4J バージョンは 1.6.1 です。
ベストアンサー1
SLF4J 1.6.0以降では、複数のパラメータが存在し、ログ出力ステートメントの最後の引数が例外である場合、SLF4Jは、最後の引数を単純なパラメータではなく例外として扱うことをユーザーが望んでいると想定します。関連するFAQエントリ。
そこで、(SLF4Jバージョン1.7.x以降で)次のように記述します。
logger.error("one two three: {} {} {}", "a", "b",
"c", new Exception("something went wrong"));
または書き込み(SLF4Jバージョン1.6.xの場合)
logger.error("one two three: {} {} {}", new Object[] {"a", "b",
"c", new Exception("something went wrong")});
降伏する
one two three: a b c
java.lang.Exception: something went wrong
at Example.main(Example.java:13)
at java.lang.reflect.Method.invoke(Method.java:597)
at ...
正確な出力は、基盤となるフレームワーク (logback、log4j など) と、基盤となるフレームワークの構成方法によって異なります。ただし、最後のパラメータが例外である場合は、基盤となるフレームワークに関係なく、例外として解釈されます。