生成されたメッセージと例外のスタックトレースの両方を記録するための正しい方法は何ですか?
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
SLF4J 1.6.0以降、複数のパラメーターが存在し、ロギング・ステートメントの最後の引数が例外である場合、SLF4Jはユーザーが最後の引数を単純なパラメーターではなく例外として扱うことを望んでいると想定します。 related FAQ entry もご覧ください。
だから、書くこと(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など)と、基盤となるフレームワークの設定方法によって異なります。ただし、最後のパラメータが例外の場合は、基礎となるフレームワークに関係なく、そのように解釈されます。
@Cekiの答えに加えて、logbackを使用していて、プロジェクトに設定ファイル(通常はlogback.xml)を設定している場合は、次のようにしてスタックトレースをプロットするためのログを定義できます。
<encoder>
<pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern>
</encoder>
パターンの%exが違いを生む