フォーマットされたメッセージ、オブジェクト配列、例外をログに記録するにはどうすればよいでしょうか? 質問する

フォーマットされたメッセージ、オブジェクト配列、例外をログに記録するにはどうすればよいでしょうか? 質問する

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

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

おすすめ記事