108 votes

Comment enregistrer une exception et un message avec des caractères de remplacement avec SLF4J ?

Quelle est l'approche correcte pour enregistrer à la fois un message d'erreur et une exception à l'aide de la fonction SLF4J ?

J'ai essayé de le faire, mais la trace de pile de l'exception n'est jamais imprimée :

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

Dans ce cas, je veux remplir {} avec le inputMessage ainsi que la journalisation de la trace de l'exception.

La seule façon que je vois de le faire serait de procéder de la manière suivante :

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

ce qui n'est pas beau à voir.

150voto

Ceki Points 8781

À partir de la version 1.6 de SLF4J, SLF4J interprétera le dernier paramètre comme vous l'avez prévu, c'est-à-dire comme une exception. Vous devez utiliser une version plus ancienne de l'API SLF4J.

Cette fonctionnalité est documentée dans un faq entrée qui est également référencée dans le javadocs pour Logger .

2voto

LIU YUE Points 311

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

Oui, à partir de SLF4J 1.6.0, mais pas dans les versions précédentes. L'API SLF4J prend en charge le paramétrage en présence d'une exception, en supposant que l'exception soit le dernier paramètre. Ainsi,

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

affichera l'exception NumberFormatException avec sa trace de pile, comme prévu. Le compilateur Java invoquera la méthode d'erreur en prenant une chaîne et deux objets comme arguments. SLF4J, conformément à l'intention la plus probable du programmeur, interprétera l'instance de NumberFormatException comme un objet à jeter au lieu d'un paramètre Object inutilisé. Dans les versions de SLF4J antérieures à la version 1.6.0, l'instance NumberFormatException était simplement ignorée.

Si l'exception n'est pas le dernier argument, elle sera traitée comme un objet ordinaire et sa trace de pile ne sera PAS imprimée. Toutefois, de telles situations ne devraient pas se produire dans la pratique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X