Depuis Java 1.4, une api de logging (java.util.logging) est présente par défaut dans l’API, assez comparable à log4j avec cependant quelques détails en moins.
J’ai été surpris de ne pas pouvoir changer le pattern de sortie directement dans mon fichier de configuration et de devoir créer une classe spécifique pour ça, voilà que maintenant je me rend compte qu’il n’y a pas de niveau DEBUG mais CONFIG et je galère à trouver de la documentation pour juste changer le niveau par défaut dans un fichier de config.
Qu’utiliser pour vos log Java ? l’API java.util.logging ou log4j ?
Concernant mon problème de niveau voici mon fichier de configuration :
Je devrais donc voir apparaitre dans la console tout les messages du niveau finest au niveau severe. Or lorsque je fais un logger.fine(“bla”), je n’ai rien en console alors qu’un logger.info(“bla”) m’affiche bla. Quel est donc ce mystère ? Finest est bien un niveau au dessous de Finer qui est lui même un niveau au dessous de Fine, non ?
Log4J pour moi. Tout simplement parce que c’est le standard dans ma boite et pas seulement dans ma boite. C’est vraiment bien documenté, on peut faire joujou avec les patterns… tu trouves toujours quelqu’un qui connaît, etc. Seul bémol : jme souviens m’être pris le chou avec certains WAS qui embarquent un log4j et une conf particulière. Du coup si tu mets ton jar log4j dans ta webapp bah tu te retrouves avec des conflits, bref c’est parfois relou.
Je sais pas si j’ai fait avancé le truc, mais ma philosophie dans pas mal de cas c’est choisir l’option la plus documentée, comme ça si je galère je sais que je serais épaulé B)
Log4j est clairement un standard de facto. Et son pendant .Net (log4net) est également bien répandu côté projets C#, ce qui permet de réutiliser sa connaissance du framework en cas de changement de techno.
Hors sujet mais il je plussoie le fait que Log4J est une révolution dans le logging lorsque l’on voit les adaptations de cette API dans les autres langage, j’utilise moi même log4perl.
Ni l’un ni l’autre B)
java.util.logging c’est le plus petit dénominateur commun du log, ya vraiment que la base … (il manque par exemple les MDC de log4j/logback)
log4j c’est le plus connu, mais le projet est mort (ie. plus de dev) et la doc officielle est payante
le winner est donc logback (développé par le créateur de log4j) !
Je t’invite à lire cet article
Autre considération à ne pas oublier : la facade de logs.
Comme aucun framework ne se met d’accord sur l’implem de log à utiliser (java.util.logging, log4j, logkit, logback et il y en a plein d’autres …), le standard était jusqu’au aujourd’hui d’utiliser commons-logging qui est une facade : ainsi ton appli et toutes ses libraries loggent en utilisant la meme API qui est cette fameuse façade, et tu choisis quel logger tu peux derrière ta facade (jul, log4j ou autre …). L’intérêt est d’avoir un fichier de log unique pour toute ton appli (plutôt que un pour ton code applicatif, un autre pour spring, un 3eme pour hibernate …)
Et comme c’est pas encore assez compliqué, commons-logging c’est de l’histoire ancienne : maintenant on utilise slf4j.
En résumé, tu logges avec slf4j + logback
Si tu as des questions, hésite pas B)