juin
2008
Je viens de perdre près d’une heure à me battre avec un problème étrange.
Dans l’application sur laquelle je travaille actuellement, j’utilise Spring 2.5 pour la DI ainsi que le support JDBC, et je viens de migrer de Log4j à Log5j (j’en parle dans un billet précédent).
Seulement, lors de la migration, j’arrêtais pas d’avoir une exception de type Class Cast Exception:
org.apache.log4j.Logger cannot be cast to com.spinn3r.log5j.Logger
sur la déclaration du logger:
private static final com.spinn3r.log5j.Logger log2 = com.spinn3r.log5j.Logger.getLogger();
Après près d’une heure à essayer de comprendre pourquoi, ou du moins à isoler les conditions pour reproduire ce bug, je suis arrivé à ceci:
Cette exception ne survient que si la classe contenant le logger est déclarée en scope Singleton de Spring …
Apparemment, je suis le seul au monde à utiliser Log5j car la liste des bugs est totalement vide.
J’ai donc agi en bon utilisateur, et j’ai rempli un formulaire bug dans le site de log5j.
Entre temps, je vais m’orienter plutôt vers Slf4j.
Yep, mais je présume qu’ils veulent rester compatibles Java 1.4, donc, exit les …
Tu as raison, c’est pas terrible car dans l’api de Slf4j, c’est : log.debug(String, Object[])
Si on avait log.debug(String, Object…), on pourrait simplifier en :
log.debug(« Person(id={}, name={}, age={} », person.id, person.name, person.age});
Hello,
Remarque que l’API de slf4j ne me p^laît vraiment pas du tout, et comparée à log5j, ça a plutôt l’air d’un dinosaure
Je sais, ça vient de la compatibilité avec Java 1.4, mais jugez en par vous même:
Avec Slf4j
Avec log5j
No comment !
Sinon, pour vous tenir au courant, le développeur de log5j est vraiment sympa, et deux heures chrono après que j’ai ouvert un bug-track, j’ai reçu son feedback, et il bosse sur ce problème en ce temps. Respects.
3 – Tu peux aussi ajouter jcl104-over-slf4j-1.4.3.jar et ne pas être obligé de refactorer toutes tes classes utilisant commons-logging, mais tu ne gagnes pas non plus les avantages de slf4j.
4 – slf4j supporte la gestion de la contextualisation (NDC et MDC) quand tu utilises log4j ou logback.
L’essayer c’est l’adopter
@Hikage tout a fait. les deux gros plus de sl4j sont :
1 – pas de « decouverte » au runtime de l’api d’implementation, mais tu choisis en fonction des jars qu’elle sera l’implementation
(en clair, si tu veux log4j, tu utilises comme jar slf4j-log4j12-1.4.3.jar et ainsi de suite. ca évite des problemes de classloading
2 – tu peux faire ton log avec du code de type
logger.debug(« Temperature set to {}. Old temperature was {}. », t, oldT);
qui evite de faire les horribles if (log.idDeBugEnable()) de jcl, car dans ce cas, la concatenation de String n’est faite que apres la determination du level de log
Je me trompe peut être mais SLF4J c’est juste un système de façade, qui se veut être le remplacant de Commons Loggin non ?
Tu es peut-être le seul mais je me préparais à faire la même, grâce à toi, je vais patienter encore un peu.
Je crois que je vais attendre une petite semaine avant de tenter Slf4j histoire de voir si tu ne tombe pas sur d’autres problèmes..
Merci