Cómo registrar excepciones y mensajes con marcadores de posición con SLF4J

¿Cuál es el enfoque correcto para registrar tanto un mensaje de error como una excepción usando SLF4J?

Intenté hacer esto, pero el seguimiento de la pila de excepciones nunca se imprime:

logger.error("Unable to parse data {}", inputMessage, e);

En este caso quiero poblar {} con inputMessage así como cerrar la sesión de la excepción stacktrace.

La única forma que puedo ver para hacer esto sería hacer esto:

logger.error("Unable to parse data " + inputMessage, e);

que no es bonito.

preguntado el 10 de mayo de 11 a las 13:05

Su primera línea de logger.error funciona como usted quiere en slf4j versión 1.7.25. -

2 Respuestas

A partir de la versión 4 de SLF1.6J, SLF4J interpretará el último parámetro según lo previsto, es decir, como una excepción. Debe utilizar una versión anterior de la API de SLF4J.

contestado el 11 de mayo de 11 a las 00:05

¿Está esto descrito en el Javadoc? Esperaba encontrar información similar aquí: slf4j.org/apidocs/org/slf4j/Logger.html - escocés

Te creo, pero como @Scot, esperaba que este comportamiento fuera documentado. - Stephan

Scot, @ Stephan: el comportamiento mencionado parece estar documentado en sus preguntas frecuentes. aquí. - Priidu Neemre

Esto es como un secreto mejor guardado. Gracias por mencionarlo. Mi pregunta de seguimiento es ¿por qué ocultarían el hecho de que esto es posible en un var-arg? ¿Por qué no pueden crear un nuevo método sobrecargado que tome la Throwable y luego tiene un var-arg después de eso? ¿Hay problemas de borrado? ¿Es este un estándar en otras bibliotecas para que la excepción se pase como último argumento? - gaoagong

Esto se ha documentado (¿desde entonces?) En las preguntas frecuentes: slf4j.org/faq.html#paramException . Estoy de acuerdo en que esta característica debería documentarse con mayor claridad. - Stephan202

desde http://www.slf4j.org/faq.html#paramException:

Sí, a partir de SLF4J 1.6.0, pero no en versiones anteriores. La API SLF4J admite la parametrización en presencia de una excepción, asumiendo que la excepción es el último parámetro. Por lo tanto,

String s = "Hello world";
try {
  Integer i = Integer.valueOf(s);
} catch (NumberFormatException e) {
  logger.error("Failed to format {}", s, e);
}

imprimirá la NumberFormatException con su seguimiento de pila como se esperaba. El compilador de Java invocará el método de error tomando una cadena y dos argumentos de objeto. SLF4J, de acuerdo con la intención más probable del programador, interpretará la instancia de NumberFormatException como un parámetro arrojable en lugar de un parámetro Object no utilizado. En las versiones SLF4J anteriores a la 1.6.0, la instancia de NumberFormatException simplemente se ignoró.

Si la excepción no es el último argumento, se tratará como un objeto simple y su seguimiento de pila NO se imprimirá. Sin embargo, estas situaciones no deberían ocurrir en la práctica.

Respondido 03 Feb 21, 03:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.