slf4j: como logar mensagem formatada, array de object, exceção

Qual é a abordagem correta para registrar uma mensagem preenchida e um rastreamento de pilha da exceção?

logger.error( "\ncontext info one two three: {} {} {}\n", new Object[] {"1", "2", "3"}, new Exception("something went wrong")); 

Eu gostaria de produzir uma saída semelhante a esta:

 context info one two three: 1 2 3 java.lang.Exception: something went wrong stacktrace 0 stacktrace 1 stacktrace ... 

slf4j versão 1.6.1

A partir do SLF4J 1.6.0, na presença de múltiplos parâmetros e se o último argumento em uma declaração de log é uma exceção, então o SLF4J presumirá que o usuário deseja que o último argumento seja tratado como uma exceção e não como um parâmetro simples. Veja também a input relevante da FAQ .

Então, escrevendo (no SLF4J versão 1.7.xe posterior)

  logger.error("one two three: {} {} {}", "a", "b", "c", new Exception("something went wrong")); 

ou escrevendo (no SLF4J versão 1.6.x)

  logger.error("one two three: {} {} {}", new Object[] {"a", "b", "c", new Exception("something went wrong")}); 

vai render

 one two three: abc java.lang.Exception: something went wrong at Example.main(Example.java:13) at java.lang.reflect.Method.invoke(Method.java:597) at ... 

A saída exata dependerá da estrutura subjacente (por exemplo, logback, log4j, etc) e também de como a estrutura subjacente é configurada. No entanto, se o último parâmetro for uma exceção, ele será interpretado como tal, independentemente da estrutura subjacente.

Além da resposta do @Ceki, se você estiver usando o logback e configurar um arquivo de configuração em seu projeto (geralmente logback.xml), você pode definir o log para plotar o rastreamento de pilha também usando

  %date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}  

o% ex no padrão é o que faz a diferença