web-dev-qa-db-ja.com

slf4j:フォーマットされたメッセージ、オブジェクト配列、例外を記録する方法

生成されたメッセージと例外のスタックトレースの両方を記録するための正しい方法は何ですか?

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

246
rowe

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など)と、基盤となるフレームワークの設定方法によって異なります。ただし、最後のパラメータが例外の場合は、基礎となるフレームワークに関係なく、そのように解釈されます。

378
Ceki

@Cekiの答えに加えて、logbackを使用していて、プロジェクトに設定ファイル(通常はlogback.xml)を設定している場合は、次のようにしてスタックトレースをプロットするためのログを定義できます。

<encoder>
    <pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern> 
</encoder>

パターンの%exが違いを生む

7
Yaniv